Linux下的信号应用并不复杂,最多只要以下3个步骤即可:
1.安装信号,通常采用sigaction(……)函数,此函数有3个参数,支持信号传递信息,主要用来与sigqueue()配合使用。sigaction()函数既支持实时信号的安装同样也支持非实时信号的安装。
2.实现三参数信号处理函数mysig_handler(int signal,struct siginfo *pInfo,void *)
3.用sigqueue()发送信号
对于需要发送信号的程序来说,只需实现上述1、3即可,而对于需要接收信号的程序只需实现1、2。信号发送和接收的操作具体可以参考以下两个例子:
/*********************************************************************************
*
*信号发送示例
*
*********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#define SEND_SIG SIGRTMIN+10
int main(int argc,char **argv)
{
pid_t recv_pid;
union sigval mysigval; //信号附加信息
if(argc<2){
printf("usage:%s <PID>/n",argv[0]);
exit(1);
}
recv_pid=(pid_t)atoi(argv[1]);
mysigval.sival_int=1983; //此处都1983这个值没有实际意思,纯粹为了测试
//向某一进程循环发送信号
while(1){
if(sigqueue(recv_pid,SEND_SIG,mysigval)==-1){
perror("send signal error!");
exit(1);
}
printf("Send signal(%d) to PID(%d),argv(int)=%d/n/n",SEND_SIG,recv_pid,mysigval.sival_int);
sleep(2);
}
exit(0);
}
/*********************************************************************************
*
*信号接收示例
*
*********************************************************************************/
#include <unistd.h> //sleep(...)
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#define MY_SIG SIGRTMIN+10
#define isARG 0 //0---不接收附加信息
//1---接收附加信息
/*无附加信息的信号处理例程*/
void sig_handler(int signum)
{
static int i=0;
i++;
printf(">%d ----capture signal : %d !/n",i,signum);
//接收10次信号后结束进程
if(i==10)
exit(0);
}
/*带附加信息的信号处理例程*/
void sig_handler_with_arg(int sig,siginfo_t *sig_info,void *unused)
{
printf(">Capture signal : %d !/n",sig);
printf(">Signal info : %d/n/n",sig_info->si_int);
}
int main(int argc,char **argv)
{
struct sigaction sig_act;
pid_t my_pid;
my_pid=getpid();
sigemptyset(&sig_act.sa_mask);
#if isARG //带附加信息处理
sig_act.sa_sigaction=sig_handler_with_arg;
sig_act.sa_flags=SA_SIGINFO;
#else //不带附加信息处理
sig_act.sa_handler=sig_handler;
sig_act.sa_flags=0;
#endif
//安装信号
sigaction(MY_SIG,&sig_act,NULL);
while(1){
printf("[%d]wait for the sigal/n/n",my_pid);
sleep(1);
}
exit(0);
}