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

标签 c linux signals ipc

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

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

程序获得的信号导致此 while 循环饿死。

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

我该怎么做?

最佳答案

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

关于c - 在 linux (ubuntu) 上用 C 语言延迟向我自己的进程发送信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16252843/

相关文章:

linux - 让 SSH 登录 session 重定向到交互式 telnet 到本地主机

linux - Bash脚本通过解析文本树查找最大文件

objective-c - 从 GCC 中的单独文件内联函数

c - getpeername() 不会返回正确的端口,但会返回正确的远程主机套接字地址 C 语言

安装模块时出现 Python ImportError [Ubuntu]

android-activity - 在 Activity 图中正确使用信号

c - C 的段错误处理程序只调用一次

C - 以文本作为参数

c - 如何将 uint8_t 值数组转换为 C 中的十六进制转储 char 字符串

c++ - 关于进程和信号的概念问题