信号的高级处理可以携带信息。
**
一、接收信号端
**
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
1.第一个参数为:信号名
2.第二个参数为:以下结构体
struct sigaction {
void (*sa_handler)(int); //信号处理程序,不接受额外数据,SIG_IGN 为忽略,SIG_DFL 为默认动作
void (*sa_sigaction)(int, siginfo_t *, void *); //信号处理程序,能够接受额外数据和sigqueue配合使用
sigset_t sa_mask;//阻塞关键字的信号集,可以再调用捕捉函数之前,把信号添加到信号阻塞字,信号捕捉函数返回之前恢复为原先的值。
int sa_flags;//影响信号的行为SA_SIGINFO表示能够接受数据
};
//回调函数句柄sa_handler、sa_sigaction只能任选其一
结构体中 void (*sa_sigaction)(int, siginfo_t *, void *);应定义为操作函数
eg: void handler(int signum, siginfo_t *info, void *context)
第一个参数为:信号量名称
第二个参数为:存放数据结构体
siginfo_t {
int si_signo; /* Signal number */
int si_errno; /* An errno value */
int si_code; /* Signal code */
int si_trapno; /* Trap number that caused
hardware-generated signal
(unused on most architectures) */
pid_t si_pid; /* PID号*/
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; /* 存放数字数据 */
void *si_ptr; /* POSIX.1b signal */
int si_overrun; /* Timer overrun count; POSIX.1b timers */
int si_timerid; /* Timer ID; POSIX.1b timers */
void *si_addr; /* Memory location which caused fault */
int si_band; /* Band event */
int si_fd; /* File descriptor */
}
第三个参数为: 判断是否有数据
3.第三个参数为:备份(一般写NULL);
接收端代码
**
二、发送端
int sigqueue(pid_t pid, int sig, const union sigval value);
第一个参数为:信号量号
第二个参数为:进程号
第三个参数为:联合体,存放发送的数字或字符串。
union sigval {
int sival_int;
void *sival_ptr;
};
**
发送端端代码为
三、运行过程及结果
./send 15 99773