fork()
0
/ child PID
sau -1
(+ERRNO
)wait(0)
sau wait(PID)
explicit (părinte) + exit()
(fiu)
WEXITSTATUS(status)
(status
obținut cu wait(&status)
)exec*()
(execlp()
, execve()
l
: parametrii programului nou dați ca parametri ai funcției urmați de NULLv
: parametrii sunt pasați ca șir de char* (ultimul e NULL).p
: că$PATH
(altfel, e necesară calea absolută)e
: ultimul parametru e un șir de char* ce descrie environment block-ul copiluluigetpid()
/ getppid()
signal(SIGCHLD, SIG_IGN);
errno
(și/sau strerror(errno)
, sau perror("mesaj")
) + exit(EXIT_FAILURE)
(sau exit(1)
)execl("/bin/ls", "ls", "-l", (char*)NULL);
execlp("ls", "ls", "-l", (char*)NULL);
execv():
char *args[] = {"ls", "-l", NULL};
execv("/bin/ls", args);
Analizați și explicați efectul secvenței:
int i, j, k;
i = fork();
if ((j = fork())) {
k = fork();
}
printf("%d %d %d %d %d", i, j, k, getpid(), getppid());
Explicați efectul produs de execlp("ls", "ls", "*.c", NULL);
.
Citiți o comandă de la tastatură și rulați-o cu fork
+ exec
.
Scrieți un program care fork()
ă vreme PID-ul fiecărui copil e par.
Inițializați un vector cu numerele de la 1 la N (citit de la tastatură). Programul inițial trebuie să producă un proces copil și fiecare să calculeze suma a jumătate din numere (ex. părintele săă globală comună. Explicați rezultatul.
Scrieți programe păă dacă un număr e prim; părintele afișeazăă la N citit de la tastatură (wait
+ WEXITSTATUS
).