在linux(ubuntu)上用C语言向我自己的进程发送延迟信号

在linux(ubuntu)上用C语言向我自己的进程发送延迟信号,c,linux,signals,ipc,C,Linux,Signals,Ipc,我的程序在一秒钟内收到很多信号。然而,我希望能够每秒执行一些代码。如果我这样做: toSleep = ONESEC; while (toSleep > 0) toSleep = sleep(toSleep); 程序得到的信号导致这个while循环饿死 如果有什么方法可以每秒向我自己的进程发送一个信号,那将是完美的,因为该信号将在信号队列中等待轮到它发生 我该怎么做?让孩子发出信号。一个没有错误检查的简单示例(同样,您应该使用sigaction而不是signal): #包括 #包括

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

toSleep = ONESEC;
while (toSleep > 0)
    toSleep = sleep(toSleep);
程序得到的信号导致这个while循环饿死

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


我该怎么做?

让孩子发出信号。一个没有错误检查的简单示例(同样,您应该使用sigaction而不是signal):

#包括
#包括
无效句柄(int s){return;}
内部主(空){
if(fork()){
而(1){
信号(SIGUSR1,手柄);
暂停();
printf(“接收到的信号”);
}
}否则{
而(1){
睡眠(1);
kill(getppid(),SIGUSR1);
}
}
返回0;
}

此外,不要发送信号,您可以考虑让孩子写入管道(或者使用<代码>信号()/代码>如果可用的话),然后在读取中阻塞。有时完全避免信号会更干净。

让孩子发送信号。一个没有错误检查的简单示例(同样,您应该使用sigaction而不是signal):

#包括
#包括
无效句柄(int s){return;}
内部主(空){
if(fork()){
而(1){
信号(SIGUSR1,手柄);
暂停();
printf(“接收到的信号”);
}
}否则{
而(1){
睡眠(1);
kill(getppid(),SIGUSR1);
}
}
返回0;
}

此外,不要发送信号,您可以考虑让孩子写入管道(或者使用<代码>信号()/代码>如果可用的话),然后在读取中阻塞。有时完全避免信号会更干净

#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;
}