Почему этот код не работает? ребенок не ждет

Итак, я пытался научиться осваивать дочерние процессы и правильно ждать их завершения. Я много читал о Stack Overflow Q / A и до сих пор не могу заставить это работать так, как мне хочется. Я читал / искал книгу (C ++ Primer плюс 6-е изд.) — я провел некоторое исследование и все еще не могу заставить его ждать, как я хотел.

Итак, я посмотрел несколько вещей здесь, на переполнение стека для справки: Проверка статуса дочернего процесса в C ++

Вот что я пробовал до сих пор:

using namespace std;
int main() {
int status;
pid_t child;
child = fork();

if ( child > 0 ) {
cout << "\nChild #1 is in charge\n";
execlp("ls", "ls", NULL);
}

else if ( child < 0 ) {
cout << "\nSomething wen't wrong in the forking process\n";
}

else {

}

child = fork();
if ( child > 0 ) {
cout << "\nSecond child is in charge\n";
execlp("locate", "locate", "etc", NULL);
}

else if ( child < 0 ) {
cout << "\nSomething went wrong in the forking of second child!\n";
}

else {

}

Теперь это покажет Child #1 is in charge а также Second child is in charge тогда это будет смешивать две команды (я вижу некоторые ls между найти etc).

Второе, что я попробовал:

using namespace std;
int main() {
int status;
pid_t child;
pid_t ch_status = waitpid(child, &status, WNOHANG);

child = fork();
if ( child > 0 ) {
cout << "\nChild is in charge\n";
execlp("ls", "ls", NULL);
}

else if ( child < 0 ) {
cout << "\nSomething wen't wrong in the forking process\n";
}

if ( ch_status == 0 ) {

}

else if ( ch_status == -1 ) {
cout << "\nERROR IN CHILD #1\n";
}

else {

}

child = fork();
if ( child == 0 ) {
cout << "\nSecond child is in charge\n";
execlp("locate", "locate", "etc", NULL);
}

else if ( child < 0 ) {
cout << "\nSomething went wrong in the forking of second child!\n";
}

if ( ch_status == 0 ) {

}

else if ( ch_status == -1 ) {
cout << "\nERROR IN CHILD #1\n";
}

else {

}

child = fork();
if ( child > 0 ) {
cout << "\nThird child is in charge!\n";
execlp("echo", "echo", "herro", NULL);
}

else if ( child < 0 ) {
cout << "\nForking of third child failed!\n";
}

if ( ch_status == 0 ) {

}

else if ( ch_status == -1 ) {
cout << "\nERROR IN CHILD #2\n";
}

else {

}

return 0;
}

Это больше основано на ссылке, которую я предоставил, это дало тот же результат, что и первый тестовый прогон, который я сделал, за исключением того, что он также показывает ERROR IN CHILD #1/2,

Команды не имеют значения, я просто не хочу понимать, что я делаю здесь неправильно … Я также попытался их вставить в else { //start second fork here }Но с этим я тоже ничего не получил.

Из того, что я понимаю после прочтения waitpid(2) руководство, которое я должен использовать WNOHANG;
http://linux.die.net/man/2/waitpid

Любые предложения / указатели с благодарностью.

Если возможно, пожалуйста, отправьте пример кода того, как вы достигнете правильного результата (execute command 1 -> wait until done -> execute command 2 -> exit),

С нетерпением ждем ответов.

2

Решение

Вы должны звонить waitpid() в родительском после ты вилка. То есть он должен идти в child > 0 ветка.

Цель функции — «дождаться изменения дочернего состояния». Тем не менее, вы звоните до того, как родите ребенка.

Код должен выглядеть следующим образом:

using namespace std;
int main() {

int status;
pid_t child;

child = fork();
if ( child == 0 ) {
cout << "\nChild is in charge" << endl;
execlp("ls", "ls", NULL);
} else if ( child < 0 ) {
cout << "\nSomething wen't wrong in the forking process" << endl;
} else {
cout << "Parent waiting" << endl;
pid_t ch_status = waitpid(child, &status, WNOHANG);
if (ch_status == -1) {
cout << "\nERROR IN CHILD #1" << endl;
}
}

child = fork();
//same procedure as above

}
2

Другие решения

Вы неправильно оцениваете порядок, в котором выводятся выписки выполненный на основе порядка их вывода продували. Хотя вывод не может быть сброшен до тех пор, пока не будет выполнен соответствующий оператор, в вашем коде нет вызовов сброса. Так может произойти промывка много потом.

использование endl вместо того, чтобы положить \n в конце ваших строк. endl Манипулятор включает в себя флеш.

1

По вопросам рекламы [email protected]