我正在做一个经典的“等待信号”的情况。我基本上等待SIGUSR1
从execlp()
覆盖的子进程发送的sigaction()
。即使信号确实被sigwaitinfo()
捕获,该过程也永远不会从void DataThread::runWaiting()
{
while(1)
{
string data;
Bottle* bot = inPort.read();
if (bot != NULL)
{
data = bot->toString();
cout << "I'm about to send : " << data << endl;
fprintf(fromYarpPipe,"%s\n",data.c_str());
fflush(fromYarpPipe);
sigemptyset( &sigact.sa_mask );
sigact.sa_handler = catcher;
sigact.sa_flags = 0;
sigaction( SIGUSR1, &sigact, NULL );
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask,SIGUSR1);
cout << "Got this far and I'm " << getpid() << endl;
sigwaitinfo(&mask,NULL);
cout << "I just moved on !" << endl;
}
}
}
void catcher( int sig )
{
cout << "Got some signal : "<< sig << endl;;
}
继续。
这是代码(因为它不是很长,我保留了不那么相关的东西,但我基本上是使用管道向子进程发送数据。我也知道我没有检查返回值,但我'已检查,没有错误)
kill -USR1 pid
我每次sigwaitinfo()
时都会得到以下输出,但不是Got some signal : 10
后面的行......
{{1}}
答案 0 :(得分:0)
AFAIK你必须
sigprocmask( SIG_BLOCK, &waitset, NULL );
在sigaddset
之后。