【问题标题】:Sending Signals in C?在 C 中发送信号?
【发布时间】:2021-12-01 04:55:34
【问题描述】:

我读到了:

进程不能忽略两个信号——SIGKILL = 终止接收进程 – SIGSTOP = 暂停接收 进程

有些人甚至声称我们无法为他们声明处理程序

但是在 C 中我可以写:

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

void sigint_handler(int signum) {
    printf("I'm ignoring you!\n");
}

int main() {
    signal(SIGKILL,sigint_handler);
    for(;;) { /*endless loop*/ } return 0;
}

这不是矛盾吗?

附带问题,当我在终端中写kill 123 时,将发送什么信号,我在互联网上的任何地方都找不到此信息?

【问题讨论】:

  • “当我在终端中写入 kill 123 时,将发送什么信号,我在互联网上的任何地方都找不到此信息?” - man 1 kill 表示 "如果没有指定信号,则发送TERM信号"
  • signal(SIGKILL,sigint_handler); 调用的返回值是多少?如果返回SIG_ERR,那么errno的值是多少?
  • 尝试SIGKILLSIGSTOP 都失败了,你只是不检查返回值:onlinegdb.com/J9c-6_5LZ
  • 编写试图做非法事情的代码并不一定意味着无法编译代码——后果可能直到运行时才生效...
  • 实际发送信号时会发生什么?它是否打印“我忽略了你!”?还是停止运行?

标签: c linux process signals handler


【解决方案1】:

根据POSIX-1.2017 General Information §2.4.3 Signal Actions ,当一个信号被传递到一个进程时,它可能具有三种不同的处置或“采取的行动”之一:

  • SIG_DFL:采取默认或“正常”操作。
  • SIG_IGN:忽略信号(不采取任何行动)。
  • 用户定义:信号被用户定义的信号处理程序“捕获”。

也就是说,POSIX 的同一部分也阐明了:

系统不允许将信号 SIGKILL 或 SIGSTOP 的动作设置为 SIG_IGN。
....
系统不允许进程捕获信号 SIGKILL 和 SIGSTOP。

如果您检查了signal() 调用的返回码和errno,您几乎肯定会看到failing with EINVAL

【讨论】:

    猜你喜欢
    • 2017-05-20
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 2011-04-16
    • 2011-07-14
    • 1970-01-01
    • 2010-09-13
    • 2011-01-08
    相关资源
    最近更新 更多