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

Posted

技术标签:

【中文标题】在 linux (ubuntu) 上的 C 中延迟向我自己的进程发送信号【英文标题】:Send signal with a delay to my own process in C on linux (ubuntu) 【发布时间】:2013-04-27 13:44:50 【问题描述】:

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

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

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

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

我该怎么做?

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于在 linux (ubuntu) 上的 C 中延迟向我自己的进程发送信号的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 C++/QT 应用程序在 Linux x86_64 上的 nanosleep() 中崩溃?

Linux 上的低延迟串行通信

在ubuntu中怎样将home目录转移到电脑上的其他硬盘分区上?

Linux 开启CPU高性能

linux 下使用 tc 模拟网络延迟和丢包

linux 下使用 tc 模拟网络延迟和丢包