PredchádzajúciHoreDomovNasledujúci

Čakanie na dokončenie procesu, wait

Čakanie na dokončenie ľubovoľného z detských podprocesov slúži systémové volanie wait.

Cvičenie Vytvorte zdrojový súbor wait.c s nasledovným obsahom:

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>

int main(void)
{
	pid_t pid = fork(); 1

	if(pid < 0) 2
	{
		perror("fork");
		return 1;
	}
	else if(pid > 0) 3
	{
		printf("Parent process waiting for a child to finish\n");

		int status; 4
		pid = wait(&status); 5
		printf("Child process %d finished ", pid);
		if(WIFEXITED(status)) 6
		{
			printf(
				"normally with return code '%d'\n",
				WEXITSTATUS(status) 7
			);
		}
		else
		{
			printf("abnormally\n");
		}
	}
	else 8
	{
		sleep(1);
		printf("Child process %d is working busily\n", getpid());
		sleep(1);
		return 123; 9
	}

	return 0;
}

1

Vytvoríme podproces.

2

Nastala chyba.

3

Sme v rodicovskom procese.

4

Do tento premennej uloží funkcia wait informácie o výsledku čakania.

5

Počkáme na prvý (v tomto prípade jediný) detský proces a zapamätáme si jeho identifikátor.

6

Vráti true ak proces skončil 'normálne'.

7

Vráti návratovú hodnotu funkcie main detského procesu.

8

Sme v detskom procese.

9

Návratová hodnota detského procesu.

Cvičenie Upravte súbor Makefile, pridajte do premennej OUTPUTS nový výstupný súbor wait:

OUTPUTS = pid fork wait

Skompilujte a spustite program wait:

$> make wait
$> ./wait

Na dokončenie špecifického procesu s určeným pid slúži funkcia waitipid.

Cvičenie Vytvorte zdrojový súbor waitpid.c s nasledovným obsahom:

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>

int main(void)
{
	pid_t pid = fork();

	if(pid < 0)
	{
		perror("fork");
		return 1;
	}
	else if(pid > 0)
	{
		printf("Parent process waiting for child %d to finish\n", pid);

		int status;

		while(waitpid(pid, &status, WNOHANG) == 0) 1
		{
			sleep(1);
			printf("Parent still waiting...\n");
		}

		printf("Child process %d finished ", pid);
	}
	else
	{
		printf("Child process %d is working busily\n", getpid());
		int i;
		for(i=0; i<10; ++i)
		{
			sleep(1);
		}
		return 0;
	}

	return 0;
}

1

Testujeme proces so zadaným pid, parameter WNOHANG spôsobí, že ak daný proces ešte neskončil, táto funkcia bez čakania vráti hodnotu 0.

Cvičenie Upravte súbor Makefile, pridajte do premennej OUTPUTS nový výstupný súbor waitpid:

OUTPUTS = pid fork wait waitpid

Skompilujte a spustite program waitpid:

$> make waitpid
$> ./waitpid

PredchádzajúciHoreDomovNasledujúci