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);
}