Почему вывод печатается дважды? - PullRequest
0 голосов
/ 29 сентября 2010

Может быть, для большинства из вас это выглядит по-детски, но я не могу понять этот небольшой кусочек кода.цикл for команда printf используется один раз.Почему «Форкинг pid» и после этого pid напечатаны дважды.Как это работает?Кто-нибудь может мне это объяснить?Заранее спасибо.Кто-нибудь может объяснить мне, почему мы должны использовать здесь ждать?Что я понял из справочных страниц - это ожидание, которое возвращает управление родительскому процессу?Правильно ли то, что я понял? Нужно ли использовать ожидание после разветвления процесса?Операционная система: Ubuntu, компилятор: GCC, IDE: NetBeans

Ответы [ 5 ]

3 голосов
/ 29 сентября 2010

Но это именно то, что делает fork. Вы раздвоили процесс, и все после fork будет выполнено дважды, потому что теперь у вас есть два процесса, выполняющих один и тот же код печати. Вы в основном спрашиваете, почему fork вилки. fork вилки, потому что предполагается, чтобы вилка. Вот для чего.

После fork родительский и дочерний процессы обычно выполняются параллельно , что означает, что хороший последовательный вывод, который вы видите в своем примере, не гарантируется. Вы могли бы легко получить вывод с чередованием строк из двух процессов.

wait функция в вашем случае выполняется только из родительского процесса. Это заставляет его ждать, пока дочерний процесс не завершится, и только после этого родительский процесс также будет завершен. Вызов wait в этом конкретном примере на самом деле не критичен, так как программа ничего не делает после этого, она просто завершается. Но, например, если вы хотите получить некоторую обратную связь от дочернего процесса в родительский процесс и выполнить дополнительную работу над этой обратной связью в родительском процессе, вам придется использовать wait, чтобы дождаться завершения дочернего процесса. его исполнение.

3 голосов
/ 29 сентября 2010

Вызов fork() создает новый процесс. Остальная часть кода затем выполняется из каждого из 2 процессов. (справочная страница)

1 голос
/ 29 сентября 2010

Вы печатаете в обоих процессах.Поместите цикл печати в предложение else из if (pid):

pid = fork();
if(pid)
{
    printf("Child pid: %d\n",pid);
    wait(NULL);
}
else
{
    for(i =0; i<5; i++)
        printf("%d  %d\n", i,getpid());
}

Как видите, fork возвращается дважды, один раз в родительском процессе и один раз в дочернем процессе.Возвращает 0 в дочернем элементе и pid созданного процесса в родительском.

0 голосов
/ 29 сентября 2010

fork создает новый процесс и возвращает как старый процесс (родительский), так и новый процесс (дочерний).

Вы можете определить, в каком из них вы находитесь, глядя навозвращаемое значение от fork.В родительском процессе он возвращает PID дочернего процесса.В дочернем процессе он возвращает 0.

0 голосов
/ 29 сентября 2010

Поскольку родительский и дочерний процессы выводят свои результаты.

См. Здесь: http://en.wikipedia.org/wiki/Fork_(operating_system)#Example_in_C для хорошего примера.

...