Ранний вызов waitpid неправильно собирает статус выхода

Я использую следующий код для разветвления процесса и подачи сигнала на остановку позже.

#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <iostream>

using namespace std;

sig_atomic_t stopFlag = 0;
void measurementSignalHandler(int sig) {
stopFlag = 1;
}

int main(int argc, char **argv) {
pid_t measurementPid = fork();

switch(measurementPid) {
case -1:
// fork failed
cerr << "Failed to create measurement process." << endl;
exit(1);
case 0:
// child
signal(SIGUSR1, measurementSignalHandler);
while(stopFlag == 0) {
sleep(1);
}

cout << "Done with measurements." << endl;
return 42;
default:
// parent
sleep(5);

// I do not understand why this sleep is necessary.
kill(measurementPid, SIGUSR1);
cout << "Giving measurement process some time to clean up."<< endl;
sleep(3);

int childExitStatus;
waitpid(measurementPid, &childExitStatus, 1);
if(WIFEXITED(childExitStatus)) {
cout << "Measurement process returned "<< WEXITSTATUS(childExitStatus)
<< "." << endl;
}
else if(WIFSIGNALED(childExitStatus)) {
cout << "Measurement process was terminated by signal "<< WTERMSIG(childExitStatus)
<< "." << endl;
}
else {
cout << "Measurement process ended neither on its own "<< "nor by signal." << endl;
}

return 0;
}
}

Этот код печатает (как и ожидалось):
Предоставление процессу измерения некоторое время для очистки.
Сделано с измерениями.
Процесс измерения вернулся 42.

Однако, если я пропущу оператор сна после оператора kill, я получу вместо этого:
Предоставление процессу измерения некоторое время для очистки.
Процесс измерения был прерван сигналом 80.
Сделано с измерениями.

Почему результат зависит от того, жду ли я три секунды? Не стоит ли ждать, пока ребенок вернется? Это не имеет большого значения для моего приложения (сейчас), но я хотел бы понять, как это сделать правильно. Я хотел бы дать сигнал дочернему процессу об остановке, а затем подождать, пока он не завершится «правильно»

Спасибо за вашу помощь,
Лутц

0

Решение

Задача ещё не решена.

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


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