0

我的程序在一秒钟内收到很多信号。然而,我希望能够每秒执行一些代码。如果我这样做:

toSleep = ONESEC;
while (toSleep > 0)
    toSleep = sleep(toSleep);

程序得到的信号导致这个while循环饿死。

如果有某种方法可以每秒向我自己的进程发送一个信号,那将是完美的,因为该信号将在信号队列中等待轮到它发生。

我怎样才能做到这一点?

4

1 回答 1

3

让孩子发出信号。一个没有错误检查的简单示例(另外,您应该使用 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()如果可用),然后阻止读取,而不是发送信号。有时完全避免信号会明显更干净。

于 2013-04-27T13:59:05.957 回答