Это не сработает, но я надеюсь, что этого совета достаточно, чтобы вы пошли. Задание кажется загадкой вокруг fork()
, у вашего учителя хороший вкус: -)
fork()
отличается. Возвращается дважды.
- В родительском элементе возвращается идентификатор процесса созданного процесса.
- В дочернем элементе возвращается 0; процесс всегда может определить свой PID, используя
getpid()
На самом деле назначение не является хорошим вкусом. Обычно код, использующий `fork (), никогда не позволяет какой-либо ветви уходить во вмещающий код, чтобы избежать полной ерунды. Вот так:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t pid = fork();
if (pid == 0 /*child*/) {
printf("PID %d (child) doing work\n", pid);
sleep(5);
exit(0); // don't let it continue (leak) into parent code
}
else if (pid > 0 /*parent*/) {
int status;
pid_t terminated;
printf("PID %d (parent) waiting for child PID %d\n", getpid(), pid);
terminated = waitpid(pid, &status, 0);
if (terminated == -1) {
perror("waitpid");
exit(1);
}
if (WIFEXITED(status))
printf("child exited normally with status %d\n", WEXITSTATUS(status));
else
printf("hm. child died otherwise. see 'man waidpid' for more\n");
}
return 0;
}
Имея это в виду, посмотрите на эти две невинно выглядящие строки:
pid_t p = fork(); // two processes after this
pid_t k = fork(); // executed by **two** processes, again duplicating
Итак, после этих двух строк у нас есть четыре процесса, выполняющих остальную часть кода в параллели. Это точка, где мозги взрываются. Что делает вытекший дочерний элемент строки k
, когда спрашивает, каково значение p
?
Посмотрите на вывод этой маленькой программы, чтобы увидеть, каков эффект утечки.
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(){
printf("MAIN PID %d\n", getpid());
fork();
fork();
printf("PID %d, PPID %d\n", getpid(), getppid());
return 0;
}