Родительский код вызывается дважды в многопроцессорной программе на C - PullRequest
0 голосов
/ 29 июня 2018

Я изучал форк в c, и у меня есть эта программа:

 int main(void) {
     int i;
     printf("Start program\n");
     printf("This is parent process %d: %d\n", getpid(), i);
     int pid = fork();
     printf("%d ", pid);
     if(pid == 0) {
       printf("This is process %d: %d\n", getpid(), i);
     } 
   return 0;
 }

Это вывод:

Start program
This is parent process 4467: 0
4578 Start program
This is parent process 4467: 0
0 This is process 4578: 0

Я не понимаю, почему родительский код вызывается дважды.

1 Ответ

0 голосов
/ 29 июня 2018

стандартный вывод буферизуется. Смотрите, например setvbuf (3) .

Вы забыли позвонить fflush (3) перед тем, как сделать fork (2) . Как правило, лучше сделать fflush(NULL) перед любым fork().

Это может объяснить наблюдаемое поведение (поскольку сброс происходит позже как в родительском, так и в дочернем процессах, например, при выходе из программы или возврате из main в crt0 ). Вы можете (в Linux) использовать strace (1) , чтобы более точно понять, что происходит.

КСТАТИ, fork (2) может произойти сбой. Вы должны справиться с этим (то есть обработать дело pid == -1 (или pid<0) ...).

...