我的程序会在一秒钟内获得大量信号。然而,我希望能够每秒执行一些代码。如果我这样做:
toSleep = ONESEC;
while (toSleep > 0)
toSleep = sleep(toSleep);
程序获取的信号会导致此循环变为饥饿。
如果可以通过某种方式向我自己的进程发送一个完美的信号,因为该信号将在信号队列中等待轮流发生。
我该怎么做?
答案 0 :(得分:3)
让孩子发送信号。一个没有错误检查的简单示例(同样,您应该使用sigaction而不是signal):
#include <stdio.h>
#include <signal.h>
void handle( int s ) { return; }
int main( void ) {
if( fork()) {
while( 1 ) {
signal( SIGUSR1, handle );
pause();
printf( "Signal received\n" );
}
} else {
while( 1 ) {
sleep( 1 );
kill( getppid(), SIGUSR1 );
}
}
return 0;
}
此外,您可以考虑让孩子写入管道(或者如果可用则使用signalfd()
),而不是发送信号,然后阻止读取。完全避免信号有时会更加清晰。