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