Как напечатать дочерний процесс с его именем и pid один раз под последним дочерним fork () - PullRequest
0 голосов
/ 27 марта 2019

Я учусь генерировать процесс в Linux, используя метод C ++ fork(). Когда я попытался распечатать их pid с ChildA, B, C, я создал. Это распечатать в два раза. Если я хочу, чтобы они печатались только один раз, как я могу изменить код.

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

child_C=fork();
if(Child_C==0){
  //do some function here;
}else{
  child_B=fork();
  if(Child_B==0){
    //do some function here;
    }else{
     child_A=fork();
     if(x==0){
        cout<<"i am child A" << child_A << "\n";
        cout<<"i am child B" << child_B << "\n";
        cout<<"i am child C" << child_C << "\n";
        x++;
     }
     if(Child_A==0){
        //do some function here;
     }else{
         //do some function here;
     }
  }
}

Я ожидаю выхода:

i am child A 123
i am child B 234
i am child C 345

но распечатывает:

i am child A 123
i am child B 234
i am child C 345
i am child A 0
i am child B 234
i am child C 345

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Обратите внимание на то, где находится ваша последняя вилка по отношению к раскладушкам.Если вы заметите, PID для ребенка A будет отличаться каждый раз, когда он печатается, в то время как другие два одинаковы.PID будет 0, если это дочерний элемент, в то время как PID будет чем-то другим, если это родитель.Поскольку дочерний элемент A печатает две разные вещи, это происходит как в дочернем элементе, так и в родительском элементе.

1 голос
/ 27 марта 2019
 child_A=fork();
 if(x==0){
    cout<<"i am child A" << child_A << "\n";
    cout<<"i am child B" << child_B << "\n";
    cout<<"i am child C" << child_C << "\n";
    x++;
 }

Либо x равно 0, либо нет.Если x равно нулю, то ни один из процессов, возвращающихся из вызова fork, не будет выводить.Если x не равно нулю, оба процесса будут выдавать результат.Таким образом, ваш ожидаемый результат кажется невозможным.Как каждая из этих выходных строк может запускаться один раз?

Предположительно, x был равен нулю.Таким образом, оба процесса дали результат.Различные значения «дочерний A» показывают, что одно из них получено от родителя, а другое от дочернего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...