忽略C上的信号

忽略C上的信号,c,signals,C,Signals,这不是关于代码的问题,而是关于理论的问题 我以前有过这个代码: 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

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

我以前有过这个代码:

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);
}
void处理程序(int信号){
printf(“称为\n的处理程序”);
}
结构动作法;
act.sa_handler=&handler;
act.sa_标志=0;
if(sigaction(SIGINT,&act,NULL)<0){
出口(1);
}
if(sigaction(SIGQUIT,&act,NULL)<0){
出口(1);
}
当我按下ctrl+C时,正在调用处理程序,但程序仍然退出

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


为什么?

SA_RESTART
导致可中断的系统调用(例如,
read
)在发送处理过的信号后重新启动

如果你有:

#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);
}

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

SA_RESTART
导致
EINTR
可中断系统调用(例如,
read
)在处理的信号发送后重新启动

如果你有:

#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);
}

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

请创建一个。请创建一个。是的,我在某个地方读到了关于不调用printf的相同内容,因为它是异步的。是的,我在某个地方读到了关于不调用printf的相同内容,因为它是异步的。