忽略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的相同内容,因为它是异步的。