2013-03-10 2 views
0

Я должен выработать этот код, чтобы сообщить результат для моей домашней работы. Может ли кто-нибудь помочь мне? Я не ищу ответа, но пошаговые инструкции, как это понимать.Как решить этот пример fork() в c,

int main() 
{ 
    int pid; 
    int val = 5; 

    pid = fork(); 

    if (pid == 0) val += 3; 

    if (val == 5) val++; 

    printf(“val=%d\n”, val); 
    exit(0); 
} 
+0

Что вы думаете? Вы пытались запустить его еще? –

ответ

-1
pid = fork(); 
if (pid == 0) val += 3; 
if (val == 5) val++; 
printf(“val=%d\n”, val); 

Случай 1: После fork(), родитель получает запланировано перед ребенком, и полная-х printf() вызов успешно

val = 6;   //printed by parent 
    val = 8;   //printed by child 

Случай 2: После того, как fork(), родитель получает запланирован перед ребенком, и полная-х Е() звоните успешно

val = 8;   //printed by child 
    val = 6;   //printed by parent 

- Проблема с printf() и fork() -

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

int main() 
{ 
    printf("Before forking"); 
    pid_t pid = fork(); 

    if (pid == 0) 
     printf("child printing"); 
    else 
     printf("parent printing"); 
} 

Выход

term# ./a.out 
Before forkingparent printingBefore forkingchild printing 

Проблема выше ясно, что утверждение «Перед разветвлением», печатается дважды, где он должен быть напечатан только один раз.

Раствор

  1. Использование '\n', в буфер каждую строку после каждого вызова printf().

  2. Как правильно порекомендовали here позвонить fflush(0), чтобы освободить все буферы ввода/вывода перед разветвлением.

+0

Я не понимаю, что ваш третий случай означает ... –

+0

printf() не является атомарным, между вызовом функции, процесс может быть выгружен, произошел со мной один раз –

+0

@OliCharlesworth, вот посмотрите здесь http: /stackoverflow.com/questions/2530663/printf-anomaly-after-fork –

1

код будет печатать один из следующих трех вариантов:

 
val=6 
 
val=8 
val=6 
 
val=6 
val=8 

Это зависит от того, write() системный вызов завершается первый: ребенок или родитель, и является ли дочерний процесс успешно создан (он может завершиться неудачей).

+0

Можете ли вы объяснить, почему вы думаете, что 'val = 5' будет напечатано? Я понимаю другие 2 возможности, хотя сейчас я думаю, что это единственные допустимые результаты. – Tuxdude

+1

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

+0

@OliCharlesworth - да не может быть 'val = 5', но почему бы существовать случай, когда родительский процесс ничего не печатает? – Tuxdude

Смежные вопросы