信号不仅可以用于事件的异步处理,同时也可以用作数据传输,一者用于接收数据的进程需要安装信号处理函数,专门用于接收信号,二者用于给指定的进程发送信号
发送信号的进程是:
/*
* main.cpp
*
* Created on: Jul 15, 2014
* Author: john
*/
#include<signal.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
using namespace std;
int main(int argc ,char** argv)
{
union sigval value;
int signum=SIGTERM;
pid_t pid=0;
//initializeing
value.sival_int=0;
//check the param
if(argc!=3&&argc!=5&&argc!=7)
{
cout<<"param error"<<endl;
exit(1);
}
for(int i=0;i<argc;i++)
{
if(!strcmp(argv[i],"-d"))
{
value.sival_int=atoi(argv[i+1]);
continue;
}
if(!strcmp(argv[i],"-s"))
{
signum=atoi(argv[i+1]);
continue;
}
if(!strcmp(argv[i],"-p"))
{
pid=atoi(argv[i+1]);
continue;
}
}
//use the function "sigqueue" send the signal
if(sigqueue(pid,signum,value)<0)
{
cout<<"error\n";
}
else
{
cout<<"successfully";
}
}
接收信号进程是:
/*
* main.cpp
*
* Created on: Jul 15, 2014
* Author: john
*/
#include<signal.h>
#include<iostream>
#include<unistd.h>
using namespace std;
void handler_sig(int signo,siginfo_t*siginfo,void*pvoid)
{
cout<<"recv signale: "<<siginfo->si_signo<<endl;
}
int main()
{
struct sigaction act;
act.sa_sigaction=handler_sig;
act.sa_flags=SA_SIGINFO;
//install signal process
cout<<getpid()<<endl;
sigaction(SIGINT,&act,NULL);
while(1);
return 0;
}