在Linux上的C(ubuntu)中将信号延迟发送到我自己的进程

时间:2013-04-27 13:44:51

标签: c linux signals ipc

我的程序会在一秒钟内获得大量信号。然而,我希望能够每秒执行一些代码。如果我这样做:

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

程序获取的信号会导致此循环变为饥饿。

如果可以通过某种方式向我自己的进程发送一个完美的信号,因为该信号将在信号队列中等待轮流发生。

我该怎么做?

1 个答案:

答案 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()),而不是发送信号,然后阻止读取。完全避免信号有时会更加清晰。