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

本文通过两个C程序示例介绍了如何使用sigqueue函数发送带参数的SIGUSR1信号,并利用sigaction函数设置信号处理器。进程A向进程B发送SIGUSR1信号,进程B在接收到信号后打印接收信息。

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) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值