【问题标题】:How to pause until signal and not have C print?如何暂停直到信号并且没有 C 打印?
【发布时间】:2021-10-22 07:00:10
【问题描述】:

我猜我需要在我的信号处理程序中调用一些函数,但我不知道它是什么

我的程序想要休眠,直到它收到某种信号。所以很自然地我使用了pause()。现在,当我发送我的应用程序 SIGUSR1 时它运行得很好,但是我得到了 User defined signal 1 的打印输出,这不是我想要的,因为我计划发送很多信号,这会使控制台无法读取。我尝试通过写signal(SIGUSR1, mySignalHandler); 来处理信号,但现在pause() 在收到信号后不再恢复。我需要从 mySignalHandler 调用某种函数吗?

【问题讨论】:

  • 您不应在信号处理程序中调用函数。您在信号内设置一个变量,并从程序内的循环中检查该变量。循环内的等待可以通过 sleep() 来完成,因为信号会唤醒睡眠。
  • 你知道打印“用户定义的信号1”吗?请告诉我们minimal reproducible example
  • @thebusybee 我写代码的错误与解决方案无关。原来在线程中执行 raise 并没有真正将它发送到主线程。它试图自己处理。只需要 Mathieu 的例子就向我展示了如何正确地做到这一点,并注意到他所做的和我所做的之间的区别

标签: c signals


【解决方案1】:

程序接收到 USR1 信号时的默认行为是终止(参见https://www.man7.org/linux/man-pages/man7/signal.7.html,标准信号)。

一个空的信号句柄只会做你想做的事:不会显示任何消息。

#include <unistd.h>
#include <stdio.h>
#include <signal.h>

static int s_got = 0;

void handler(int s) 
{
    ++s_got;
}

int main(void)
{
    signal(SIGUSR1, handler);
    while(1) {
        pause();
        printf("resumed %d\n", s_got);
    }
    return 0;
}
:~/so/pause$ gcc -Wall main.c
:~/so/pause$ ./a.out &
[1] 2286
:~/so/pause$ pkill -USR1 a.out
resumed 1
:~/so/pause$ pkill -USR1 a.out
resumed 2
:~/so/pause$ pkill -USR1 a.out
resumed 3
:~/so/pause$ pkill -USR1 a.out
resumed 4
:~/so/pause$ pkill -USR1 a.out
resumed 5
:~/so/pause$ 

【讨论】:

  • 哦,谢谢。看来,当我确实在线程中引发时,它杀死了线程并且没有将信号发送到我的应用程序。我很困惑为什么您的示例有效,而我的示例直到几分钟后才有效
  • 嘿,Mathieu 似乎我的大部分问题都很难得到任何支持或答案(不是这个)。所以说如果我没有得到支持,我可能会被禁止提问。你介意提出几个你认为好的问题吗? stackoverflow.com/help/question-bans
猜你喜欢
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
相关资源
最近更新 更多