С++ fork и возвращаемое значение waitpid в обработчике сигнала

raggakings

Братцы с ВМК, объясните физику почему если waitpid вызываеся в обработчике сигнала, он возвращает 1 а не pid завершившегося процесса (ребенка)?
Вот тот код по которому у меня ворпос.
Заранее спасибо.
  

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


void handler (int sig_num) {
std::cerr << "Hanlde " << std::endl;
if(sig_num == SIGCHLD) {
int status;
while(int a = waitpid(-1,&status,WNOHANG) > 0) { /* clean up child processe*/
std::cerr << "SIGNAL::HANDLE::Erase pid = " << a <<std::endl;
}
}
}


int xxx (void) {
// using namespace boost::interprocess;
using namespace std;
try{
std::ofstream file("file_name");

for(int i = 0; i < 4; ++i){
cerr << "Process name, ";
cerr << "This is iteration #" << i;
cerr << std::endl;
sleep(1);
}
}
catch(...){
// std::cout << ex.what << std::endl;
return 1;
}
return 0;

}

int main
{
signal (SIGCHLD,&handler);

int ii = fork ;
switch(ii) {
case -1: {
// throw ....
}
case 0: {
xxx;
exit ( 0 );
}
default: {
std::cerr << "Pid Is " << ii << std::endl;
xxx;

}
}
std::cerr << "Child done "<< wait(NULL);
sleep(10);
}

raggakings

Закоментируйте предпоследнюю строку.
std::cerr << "Child done "<< wait(NULL);
Забыл выкинуть из примера.
Спасибо

ppplva

Потому что приоритеты операций.
И вообще такие вещи делать в обработчике сигналов не надо. Например, std::cerr<< может брать мьютекс, и если сигнал придет в неудачный момент, получится дедлок.

zorin29

ну да, автор сделал не (int a=waitpid > 0, а int a = (waitpid>0)
Оставить комментарий
Имя или ник:
Комментарий: