cout << fork () точно вызывает fork ()? - PullRequest
0 голосов
/ 10 декабря 2018

У меня проблема с функцией fork.

cout << fork();

точно вызывает fork ()?Я пытаюсь создать дерево процессов, но все еще не знаю, как управлять функцией fork ().Я написал простой код, чтобы понять его, но он ничего не объясняет.

int mainPID = getpid();
cout << "Main process: " << mainPID << endl << endl;

cout << fork() << endl;
cout << getpid() << endl;
cout << getppid() << endl;

Возвращает: 118, 119, 120 Программа заканчивается и получает другие значения на экране 0, 118, 1 Is cout << fork ()как сделать fork ()?Я думал, что получаю только значения, связанные с моим mainPID. </p>

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

0 возвращаемое значение из дочернего процесса с cout << fork() << endl;

118 из дочернего pid cout << getpid() << endl;

1 из идентификатора родителя cout << getppid() << endl;, потому что реальный родитель уже завершенпоэтому ваш дочерний процесс был отменен, поэтому он принимает init с pid = 1 в качестве нового родителя.

Я рекомендую изменить некоторый код, чтобы четко разделить дочерний и родительский процесс, что-то вроде этого

if ((pid = fork()) == -1) return -1;

if (pid == 0) 
    {
    //source for child process
    }else{
    //source for parent process
    }
0 голосов
/ 10 декабря 2018

fork() возвращается дважды: один раз в исходном родительском процессе, а также в дочернем процессе.В родительском процессе он возвращает PID дочернего процесса.В дочернем процессе он возвращает 0.

. В обоих процессах возвращаемое значение затем печатается как cout <<.Таким образом, вы получите несколько выходных данных.

Если родительский процесс завершится быстро, он завершится до того, как дочерний процесс вызовет getppid().Дочерний процесс будет наследоваться процессом init, который является PID 1.Таким образом, ребенок печатает 1, когда он достигает cout << getppid() << endl;.

...