linux中高级信号函数sigaction和sigqueue实例

时间:2021-11-11 14:45:35
/*************************************************************************
	> 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);
}

linux中高级信号函数sigaction和sigqueue实例

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