(1)发送信号传参
前面已经知道从一个进程向另一个进程发送信号可以使用kill函数,但是kill函数在向进程发送信号的时候不能携带除了信号以外的其他信息,这时可以使用与kill相对应的sigqueue函数,该函数也是向一个进程发送信号,但是可以携带其它参数信息:
int sigqueue(pid_t pid, int sig, const union sigval value); 成功:0;失败:-1,设置errno
union sigval { //向进程发送一个联合体变量value
int sival_int;
void *sival_ptr;
};
即sigqueue函数在向进程发送信号的同时,还可向进程发送一个变量value,包含两个成员:一个是整型数据sival_int;另一个是泛型指针sival_ptr(通过该指针可以携带任何数据)。但是要注意一点:整型数据是按值传递,因此没有问题;而发送的指针是该进程自己进程空间的虚拟地址,不同进程之间虚拟地址空间各自独立,将当前进程地址传递给另一进程没有实际意义。即进程给自己发送信号,传送指针才会有意义。
(2)捕捉函数传参
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
当注册信号捕捉函数,希望获取更多信号相关信息,不应使用sa_handler而应该使用sa_sigaction。但此时的sa_flags必须指定为SA_SIGINFO。siginfo_t是一个成员十分丰富的结构体类型,可以携带各种与信号相关的数据。sa_flags为0,则捕捉函数使用sa_handler,且为默认属性(在调用户处理函数期间屏蔽信号本身);sa_flags为SA_SIGINFO,则捕捉函数使用sa_sigaction,该函数可以携带更多的参数:第一个参数同sa_handler函数,默认为信号编号,但自己也可以赋值;第二个参数为传出参数,是一个结构体类型,其中包含了信号相关的数据;第三个参数为传入参数,可以传入一个泛型指针。