UNIX/Linux信号
有人能告诉我为什么program1的信号处理器不工作吗UNIX/Linux信号,unix,signals,Unix,Signals,有人能告诉我为什么program1的信号处理器不工作吗 Program1: signal1.c #include <stdio.h> #include <signal.h> void handler(int sig) { printf("Caught signal: %d",sig); signal(sig,handler); } int main() { struct sigaction sa; sa.sa_handler=handle
Program1: signal1.c
#include <stdio.h>
#include <signal.h>
void handler(int sig)
{
printf("Caught signal: %d",sig);
signal(sig,handler);
}
int main()
{
struct sigaction sa;
sa.sa_handler=handler;
sa.sa_sigaction=NULL;
sigaction(SIGRTMIN,&sa,NULL);
kill(0,SIGRTMIN);
}
Actual Output:
# ./a.out
Real-time signal 0
Expected Output:
Caught signal: 34
Program1:signal1.c
#包括
#包括
无效处理程序(int sig)
{
printf(“捕获信号:%d”,信号);
信号(信号发生器,处理器);
}
int main()
{
struct-sigaction-sa;
sa.sa_handler=handler;
sa.sa_sigaction=NULL;
sigation(SIGRTMIN,&sa,NULL);
kill(0,SIGRTMIN);
}
实际产量:
#/a.out
实时信号0
预期产出:
捕获信号:34
请帮我解决程序1
但是,如果我像往常一样使用一个简单的信号处理程序,则program2可以工作:
enter code here
#include <stdio.h>
#include <signal.h>
void handler(int sig)
{
printf("Caught signal: %d\n",sig);
signal(sig,handler);
}
int main()
{
signal(SIGRTMIN, handler);
kill(0,SIGRTMIN);
}
Output:
Caught signal: 34
在此处输入代码
#包括
#包括
无效处理程序(int sig)
{
printf(“捕获的信号:%d\n”,sig);
信号(信号发生器,处理器);
}
int main()
{
信号(SIGRTMIN,处理器);
kill(0,SIGRTMIN);
}
输出:
捕获信号:34
这是因为sa_handler
和sa_sigaction
是同一工会的成员:
struct sigaction {
union {
__sighandler_t _sa_handler;
void (*_sa_sigaction)(int, struct siginfo *, void *);
} _u;
sigset_t sa_mask;
unsigned long sa_flags;
void (*sa_restorer)(void);
};
#define sa_handler _u._sa_handler
#define sa_sigaction _u._sa_sigaction
因此,当您设置sa_sigaction
时,它会覆盖sa_handler
值。@Maxim:,此链接表示它不是一个联合体?@Maxim:尽管当我在链接中注释掉“sa.sa_sigaction=NULL”时它仍然有效:“在某些架构中涉及联合体:不要同时分配给sa_handler和sa_sigaction。”@马克西姆:那么使用方法1或方法2捕捉信号的方法是另一种吗?我是说我们能用的人吗?哪个更可取“sigaction()函数为控制信号提供了更全面、更可靠的机制;新应用程序应使用sigaction()而不是signal()