一、kill 和 raise 信号发送函数
kill 和 raise 信号的发送函数的原型分别为:
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
#include <signal.h>
int raise(int sig);
kill 函数向指定进程发送指定信号;
raise 函数则允许进程向自身发送信号。
参数 pid 为将要接收信号的进程的 pid,可以通过 getpid() 函数获得;
参数 sig 为要发送的信号,如果成功,返回 0,否则为 -1。
二、sigqueue 信号发送函数
sigqueue 也可以发送信号,并且能传递附加的信息,其原型为:
#include <signal.h>
int sigqueue(pid_t pid, int sig, const union sigval value);
参数 pid 为接收信号的进程;
参数 sig 为要发送的信号;
参数 value 为一整型与指针类型的共用体:
union sigval{ //同一时间只能传递一个,因为是共用体
int sival_int; //可以传递整型
void* sival_ptr; //其他类型
};
由 sigqueue 函数发送的信号的第 3 个参数 sival_ptr 的值,可以被进程的信号处理函数的第 2 个参数 info->si_ptr 接收到,整型的 sival_int 可以被信号处理函数的第 2 个参数 info->si_int 接收到。
注意:一个进程向另外一个进程发送信号时,发送进程不要将自己进程空间的地址发送给接收进程,因为接收进程接收到地址也访问不到发送进程的地址空间。要用 ps -aux 查看接收端的进程号,然后发送端向该进程号发送数据。(注意:经过验证,发现在不同的进程之间利用 sigqueue 传递数据时,只能传递整型值,传递字符串失败)