linux编程中会对信号进行操作,经常进行捕捉和发送;经常用到对信号的捕捉和发送函数有两对。
1、比较简单的:kill()(用于发送信号)和signal()(用于捕捉信号)
2、高级一些的:sigaction()(用于发送信号)和sigqueue()(用于捕捉信号)
希望对需要的人起到帮助。
下面是简单的应用:
//上面的结构体都是系统函数已经定于好的
#include
#include
#include
#include
void my_sigaction(int signo, siginfo_t *info, void *acInfo)
{
printf("Cat a singal:%d\n",signo);
printf("send signal id:%d\n",info->si_pid);
printf("Reveive value_wordr:%s\n",(char *)info->si_value.sival_ptr);
}
int main()
{
char buf[]={"great"};
//在父进程中创建一个子进程
int iFork = fork();
if (iFork > 0)//父进程
{
struct sigaction act;
memset(&act,0,sizeof(act));
/*
//当act.sa_flags = 0时函数sigaction的使用方法
//给act设置值
act.sa_flags = 0;//使用结构体struct sigaction中的void (*sa_handler)(int)去处理信号
act.sa_handler = signal_handler;//设置函数指针
sigemptyset(&act.sa_mask);//清空结构体struct sigaction中的sa_mask,避免随机值
//信号安装
sigaction(SIGINT, &act,NULL);
*/
//当act.sa_flags = SA_SIGINFO时函数sigaction的使用方法
//给act设置值
act.sa_flags = SA_SIGINFO;//使用结构体struct sigaction中的void (*sa_sigaction)(int, siginfo_t *, void *);去处理信号
act.sa_sigaction = my_sigaction;//设置函数指针
sigemptyset(&act.sa_mask);//清空结构体struct sigaction中的sa_mask,避免随机值
//信号安装
sigaction(SIGINT, &act,NULL);
while (1)
{
pause();
}
}
else if (iFork == 0)//子进程
{
sleep(1);
union sigval val;
val.sival_ptr = (void *)buf;
sigqueue(getppid(),SIGINT,val);
}
else
{
perror("fork error:");
}
return 0;
}