Процессы структурированы в направленном дереве , где вы знаете только своего единственного родителя (getppid()
). Короче говоря, fork()
возвращает <strong>-1</strong>
при ошибке, как и многие другие системные функции, ненулевое значение полезно, чтобы инициатор вызова fork (родительский) знал свой pid new-child.
Ничто так не хорошо, как пример:
/* fork/getpid test */
#include <sys/types.h>
#include <unistd.h> /* fork(), getpid() */
#include <stdio.h>
int main(int argc, char* argv[])
{
int pid;
printf("Entry point: my pid is %d, parent pid is %d\n",
getpid(), getppid());
pid = fork();
if (pid == 0) {
printf("Child: my pid is %d, parent pid is %d\n",
getpid(), getppid());
}
else if (pid > 0) {
printf("Parent: my pid is %d, parent pid is %d, my child pid is %d\n",
getpid(), getppid(), pid);
}
else {
printf("Parent: oops! can not create a child (my pid is %d)\n",
getpid());
}
return 0;
}
И результат (в данном случае bash - это pid 2249):
Entry point: my pid is 16051, parent pid is 2249
Parent: my pid is 16051, parent pid is 2249, my child pid is 16052
Child: my pid is 16052, parent pid is 16051
Если вам нужно разделить некоторые ресурсы (файлы, родительский pid и т. Д.) Между родителем и потомком, посмотрите на clone()
(для библиотеки GNU C и, возможно, других)