Č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();if(pid < 0)
{ perror("fork"); return 1; } else if(pid > 0)
{ printf("Parent process waiting for a child to finish\n"); int status;
pid = wait(&status);
printf("Child process %d finished ", pid); if(WIFEXITED(status))
{ printf( "normally with return code '%d'\n", WEXITSTATUS(status)
); } else { printf("abnormally\n"); } } else
{ sleep(1); printf("Child process %d is working busily\n", getpid()); sleep(1); return 123;
} return 0; }
Vytvoríme podproces. |
|
Nastala chyba. |
|
Sme v rodicovskom procese. |
|
Do tento premennej uloží funkcia |
|
Počkáme na prvý (v tomto prípade jediný) detský proces a zapamätáme si jeho identifikátor. |
|
Vráti |
|
Vráti návratovú hodnotu funkcie |
|
Sme v detskom procese. |
|
Návratová hodnota detského procesu. |
Cvičenie Upravte súbor
Makefile
, pridajte do premennejOUTPUTS
nový výstupný súborwait
:OUTPUTS = pid fork waitSkompilujte 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){ 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; }
Testujeme proces so zadaným |