2012-01-14 2 views
5
void child(int pid){ 
    printf("Child PID:%d\n",pid); 
    exit(0);  
} 
void parent(int pid){ 
    printf("Parent PID:%d\n",pid); 
    exit(0); 
} 

void init(){ 
    printf("Init\n");//runs before the fork 
} 


int main(){ 

    init();//only runs for parent i.e. runs once 
    printf("pre fork()");// but this runs for both i.e. runs twice 
    //why??? 

    int pid = fork(); 

    if(pid == 0){ 
     child(pid); //run child process 
    }else{ 
     parent(pid);//run parent process 
    } 
    return 0; 
} 

выход:Системный вызов Unix fork(), который работает, когда?

Init 
pre fork()Parrent PID:4788 
pre fork()Child PID:0 

У меня есть процесс в ОС Unix (Ubuntu в моем случае). Я не могу, чтобы жизнь меня поняла, как это работает. Я знаю, что функция fork() разделяет мои программы в двух процессах, но откуда? Создает ли он новый процесс и снова запускает всю основную функцию, и если да, то почему init() запускается только один раз и printf() дважды?

Почему функция printf("pre fork()"); работает дважды, а функция init() работает только один раз?

ответ

22

Существует только один процесс до вилки. То есть, этот путь выполняется только один раз. После вилки есть 2 процесса, поэтому код, следующий за этим системным вызовом, выполняется обоими процессами. То, что вы игнорируете, состоит в том, что оба завершатся, и оба вызовут exit.

В вашем коде вы не промываете stdio. Таким образом, оба процесса делают это (выход сбрасывает буферы stdio) - вот почему вы видите этот вывод.

Попробуйте это:

printf("pre fork()\n"); 
        ^^ should flush stdout 

Или, может быть,

printf("pre fork()\n"); 
fflush(stdout); 
+0

спасибо большое. действительно полезно: D – boogie666

+0

Вау, это так тонко! +1 от меня! –

+2

Простое размещение символа новой строки не обязательно очищает буфер. Запустите код с перенаправлением stdout в обычный файл, и вы увидите точно такое же поведение. stdout - это * not * строка, буферизованная по умолчанию, если она не является tty. –

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