Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UNIX/Linux信号_Unix_Signals - Fatal编程技术网

UNIX/Linux信号

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的信号处理器不工作吗

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()