我的程序在一秒钟内收到很多信号。然而,我希望能够每秒执行一些代码。如果我这样做:
toSleep = ONESEC;
while (toSleep > 0)
toSleep = sleep(toSleep);
程序得到的信号导致这个while循环饿死。
如果有某种方法可以每秒向我自己的进程发送一个信号,那将是完美的,因为该信号将在信号队列中等待轮到它发生。
我怎样才能做到这一点?
让孩子发出信号。一个没有错误检查的简单示例(另外,您应该使用 sigaction 而不是信号):
#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()
如果可用),然后阻止读取,而不是发送信号。有时完全避免信号会明显更干净。