linux 信号的捕捉和发送函数的简单使用:sigaction()和sigqueue()

linux编程中会对信号进行操作,经常进行捕捉和发送;经常用到对信号的捕捉和发送函数有两对。

1、比较简单的:kill()(用于发送信号)和signal()(用于捕捉信号)

2、高级一些的:sigaction()(用于发送信号)和sigqueue()(用于捕捉信号)

希望对需要的人起到帮助。

下面是简单的应用:



/*
union sigval 
{
int   sival_int;
void *sival_ptr;
};
*/

/*
struct sigaction
{
void     (*sa_handler)(int);
void     (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t   sa_mask;
int        sa_flags;
void     (*sa_restorer)(void);
};*/


//siginfo_t
//{
// int      si_signo;    /* Signal number */
// int      si_errno;    /* An errno value */
// int      si_code;     /* Signal code */
// pid_t    si_pid;      /* Sending process ID */
// uid_t    si_uid;      /* Real user ID of sending process */
// int      si_status;   /* Exit value or signal */
// clock_t  si_utime;    /* User time consumed */
// clock_t  si_stime;    /* System time consumed */
// sigval_t si_value;    /* Signal value */
// int      si_int;      /* POSIX.1b signal */
// void    *si_ptr;      /* POSIX.1b signal */
// void    *si_addr;     /* Memory location which caused fault */
// int      si_band;     /* Band event */
// int      si_fd;       /* File descriptor */
//}

//上面的结构体都是系统函数已经定于好的

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



你可能感兴趣的:(linux 信号的捕捉和发送函数的简单使用:sigaction()和sigqueue())