【问题标题】:Ignoring a signal on C忽略 C 上的信号
【发布时间】:2020-05-02 11:48:01
【问题描述】:

这不是关于代码的问题,而是关于理论的问题。

我之前有这个代码:

void handler(int signal){
    printf("Handler called\n");
}

struct sigaction act;
act.sa_handler = &handler;
act.sa_flags = 0;


if (sigaction(SIGINT, &act, NULL) < 0){
    exit(1);
}

if (sigaction(SIGQUIT, &act, NULL) < 0){
    exit(1);
}

当我按下ctrl + C 时,处理程序被调用,但程序仍然退出。

现在,出于好奇,我尝试将标志更改为SA_RESTART。现在它没有退出。

为什么?

【问题讨论】:

标签: c signals


【解决方案1】:

如果你有:

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

void handler(int signal)
{
    printf("Handler called\n");
}

int main()
{
    struct sigaction act;
    act.sa_handler = &handler;
    act.sa_flags = 0;
    if (sigaction(SIGINT, &act, NULL) < 0){ exit(1); }
    char ch; ssize_t nr;
    nr=read(0,&ch,1);
}

然后使用SA_RESTART,就好像nr=read(0,&amp;ch,1); 行已被替换为

while(0>(nr=read(0,&ch,1)) && errno==EINTR){}`

请注意,您应该只在信号处理程序中调用异步信号安全函数。处理程序中的printf 通常是未定义行为的秘诀,尽管在这种特殊情况下,您只是中断本身是异步信号安全的代码(read),它是相当安全的,尽管 POSIX 没有t 明确批准它(AFAIK)。

【讨论】:

  • 是的,我在某处读到过关于不调用 printf 的相同内容,因为它是异步的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多