sigaction:接收、捕捉(预设值接收)
这个结构体的中sa_flag要设置为:SA_SIGINFO,才能使用使用拓展信号响应函数
标准信号响应函数:typedef void (*sighandler_t)(int);
拓展信号响应函数:void (*sa_sigaction)(int, siginfo_t *, void *);
sa_sigaction赋值为你要的信号响应函数的地址
sigqueue(发送)
该函数的第三个参数:联合体分析(不难推出,这个联合体就是存放你要外带的数据)
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
void Sig_Task(int sig_num, siginfo_t *data_p, void *p);
void Sig_Task(int sig_num, siginfo_t *data_p, void *p)
{
//外带的数据要在信号响应函数内打印
printf("信号值%d---外带数据%s\n", sig_num, (char *)data_p->si_ptr);
}
int main()
{
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_flags = SA_SIGINFO; //设置拓展为信号响应函数
act.sa_sigaction = Sig_Task; //指定进程的拓展信号响应函数
int sig_ret = sigaction(SIGUSR1, &act, NULL);
if (sig_ret == -1)
{
perror("sigaction");
exit(-1);
}
else
{
printf("外带数据预设值成功!\n");
}
union sigval value;
value.sival_ptr = malloc(sizeof(char) * 20);
if (value.sival_ptr == NULL)
{
perror("malloc");
exit(-1);
}
strcpy(value.sival_ptr, "Hello world!");
//sigqueue(给谁发<进程号>,发什么(信号值),外带什么数据<联合体>);
int sigqueue_ret = sigqueue(getpid(), SIGUSR1, value);
if (sigqueue_ret == -1)
{
perror("sigqueue");
exit(-1);
}
else
{
printf("外带数据信号发送成功!\n");
}
while(1)
{
sleep(1);
}
return 0;
}