2014-01-10 5 views
0

, когда я скомпилирую этот код и запускаю его. Я получаю результат «PARENT» появляется перед «CHILD». Для информации я на Linux Mint.Функция Fork в Linux Mint

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 

void main(){ 

pid_t pidc ; 
pidc = fork(); 

if(pidc < 0) 
{printf("error !\n");} 

else if(pidc == 0){ 
     printf("I am the child process! \n"); 
      } 
else{ 
     printf("I am the parent process! \n"); 
    } 
} 

и это результат:

Я родительский процесс!

Я детский процесс!

Итак, у кого-то есть идея? и спасибо.

+4

В чем же ваша проблема? Вы заявили, что происходит, но не то, что вы ожидаете или хотите произойти. – LogicG8

+1

Родительский и дочерний процессы выполняются параллельно. Это точка 'fork'. Если вы хотите, чтобы сообщения отображались в определенном порядке, не используйте 'fork'; просто распечатайте сообщения из своей программы. Кроме того, это 'int main (void)', а не 'void main()'; если вы получили 'void main()' из книги, его автор не очень хорошо знает C. Пожалуйста, определите книгу, чтобы мы могли предупредить людей. –

+0

согласны с вами, но, как правило, сначала следует отображать РЕБЕНОК, а затем РОДИТЕЛЯ, и это не тот случай! –

ответ

0

Вы можете запутаться, потому что if состояния дочернего процесса происходит до if состояний родителя.

Когда вы звоните fork(), ваш существующий процесс будет клонирован в новый процесс. Первоначальный процесс получит возвращаемое значение PID ребенка из вызова fork(), ребенок получит PID 0.

После успешного завершения fork() два процесса будут выполняться параллельно, эффективно. Для параллельной работы процессам предоставляются небольшие фрагменты времени, в течение которых они выполняются, и в конце выполнения они временно заморожены, пока выполняется другой процесс. У вас нет способа узнать, какой из двух процессов будет выполнять планирование в первую очередь. И родительский, и дочерний процесс будут выполнять тот же код, начинающийся после вызова fork(), но из-за разницы в значении для pidc они будут выбирать разные ветви оператора if. Таким образом, это первый процесс, которому дается срез времени выполнения, который будет выводиться первым, упорядочение оператора if не имеет отношения к делу.

1

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

0

Это называется состояние гонки. У вас должен быть механизм для синхронизации двух процессов.

0

Мне нужно только добавить «wait (NULL)», спасибо вам за все.

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 

void main(){ 

pid_t pidc ; 
pidc = fork(); 

if(pidc < 0) 
{printf("error !\n");} 

else if(pidc == 0){ 
     printf("I am the child process! \n"); 
      } 
else{ 
     wait(NULL); 
     printf("I am the parent process! \n"); 
    } 
} 
+0

Вы по-прежнему забыли упомянуть о том, чего вы на самом деле хотели достичь в своем вопросе, хотя этот ответ дает понять. – 0xC0000022L