Unix fork () системный вызов, что работает, когда? - PullRequest
5 голосов
/ 14 января 2012
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;
}

выход:

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

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

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

1 Ответ

23 голосов
/ 14 января 2012

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

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

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

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

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

printf("pre fork()\n");
fflush(stdout);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...