Итак, я пытался научиться осваивать дочерние процессы и правильно ждать их завершения. Я много читал о 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)
,
С нетерпением ждем ответов.
Вы должны звонить 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
}
Вы неправильно оцениваете порядок, в котором выводятся выписки выполненный на основе порядка их вывода продували. Хотя вывод не может быть сброшен до тех пор, пока не будет выполнен соответствующий оператор, в вашем коде нет вызовов сброса. Так может произойти промывка много потом.
использование endl
вместо того, чтобы положить \n
в конце ваших строк. endl
Манипулятор включает в себя флеш.