天天看点

Linuxc 信号的使用2 sigqueue函数和sigaction函数

1.进程A向进程B发送SIGUSR1信号;

2.进程B收到信号后,打印字符串“receive SIGUSR1”; 3.要求用sigqueue函数和sigaction函数实现以上功能;

源代码:

sigqueue.c #include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <signal.h>

#include <unistd.h> int main()

 int a;

 printf("请输入要接收信号的进程pid——\n");

 scanf("%d",&a);

 union sigval tt;

 tt.sival_int = 6;

 if(sigqueue(a,SIGUSR1,tt)==-1)

 {

  printf("send error\n");

 }

 return 0;

}

sigaction.c #include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <signal.h> void tt(int sig); int main()

{

 printf("%d\n",getpid());

 printf("等待接收信号---\n");

 struct sigaction act,oldact;

 act.sa_handler = tt;

 sigemptyset(&act.sa_mask);

 act.sa_flags=0;

 sigaction(SIGUSR1,&act,&oldact);   pause();  return 0;

} void tt(int sig)

{

 printf("receive SIGUSR1\n");

 printf("信号编号为:  %d\n",sig); }

1.信号发送函数—sigqueue()

#include <sys/types.h> #include <signal.h> int sigqueue(pid_t pid, int signo, const union sigval sigval_t)

调用成功返回 0;否则,返回 -1。

功能

主要针对实时信号,支持带有参数信号,与函数sigaction()配合使用

参数说明

pid:接收信号的进程ID

signo:待发送信号

sigval_t:信号传递的参数(4字节)

说明

调用sigqueue()时,sigval_t被拷贝到信号处理函数

sigqueue()发送非实时信号时

sigval_t包含的信息仍然能够传递给信号处理函数

仍然不支持排队,所有相同信号都被合并为一个信号

2.信号安装函数—sigaction()

原型定义

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

sigaction函数用于设定进程接收到特定信号后的行为。

第一个参数为信号的值,可以为除SIGKILL及SIGSTOP外的任何一个特定有效的信号(为这两个信号定义自己的处理函数,将导致信号安装错误)。

第二个参数是指向结构sigaction的一个实例的指针,在结构sigaction的实例中,指定了对特定信号的处理,如果为空,进程会以缺省方式对信号处理;

第三个参数oldact指向的对象用来保存原来对相应信号的处理,可指定oldact为NULL。如果把第二、第三个参数都设为NULL,那么该函数可用于检查信号的有效性。

第二个参数最为重要,其中包含了对指定信号的处理函数、信号所传递的信息、信号处理函数执行过程中应屏蔽掉哪些信号等等。

底层系统调用

sys_sigaction(int sig, const struct old_sigaction __user *act, struct old_sigaction __user *oact)