/*************************************************************************
> File Name: sigquque.c
> Author:
> Mail:
> Created Time: 2015年11月21日 星期六 14时33分25秒
************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
//用新的回到函数接受数据。。。。
void myHandle_forsigaction(int signum, siginfo_t *s_t, void *p)
{
printf("parent recv a sig=%d data=%d data=%d\n", signum, s_t->si_value.sival_int, s_t->si_int);
}
int main(int argc, char *argv[])
{
pid_t pid;
int ret = 0;
struct sigaction act;
act.sa_sigaction = myHandle_forsigaction;
sigemptyset(&act.sa_mask);
//如果父进程的回调函数, 准备接受额外数据
act.sa_flags = SA_SIGINFO;
if (sigaction(SIGINT, &act, NULL) < 0)
perror("sigaction error\n");
pid = fork();
if (pid == -1)
{
printf("fork err...\n");
return 0;
}
if (pid == 0)
{
int i = 0;
/*
union sigval {
int sival_int;
void *sival_ptr;
}; */
union sigval mysigval;
//mysigval.sival_ptr = (void *)&t;
mysigval.sival_int = 222;
//kill(getppid(), SIGINT);
//带额外数据
for (i=0; i<10; i++)
{
ret = sigqueue(getppid(), SIGINT, mysigval);
if (ret != 0)
{
printf("sigqueue .....\n");
exit(0);
}
else
{
printf("child send the SIGINT signal by the funtion sigqueue...%d\n", i+1);
sleep(1);
}
}
exit(10);
}
else if (pid > 0)
{
int status;
int time = 20;
while(time){
time = sleep(time);
}
wait(&status);
if(WIFEXITED(status)){
printf("the child exit code is %d\n", WEXITSTATUS(status));
}
}
exit(0);
}

最后四次是按下Ctrl+c给父进程发送SIGINT信号,然后输出的值仍然是以前的值;
浙公网安备 33010602011771号