除了发信号,还会发附加信息。kill函数的扩展。
int sigqueue(pid_t pid, int sig,
const union sigval value);
向pid进程发送sig信号,附加value值(整数或指针)。
成功返回0,失败返回-1.
注意:sigqueue函数对不可靠信号不做排队,会丢失信号。kill知识单纯的递送,对谁都不排队。
|#include <stdio.h>
|#include <signal.h>
|#include <unistd.h>
|#include <sys/wait.h>
void siginfo(int signum, siginfo_t* si, void* pv){
printf("收到了%u进程的%d信号,这个信号的附加值%d\n",getpid(),
si->si_pid,signum, si->si_value.sival_int);
usleep(100);
}
int main(void){
int signum = 50;
stuct sigaction act = {};
act.sa_sigaction = siginfo;
act.sa_flags = SA_SIGINFO | SA_RESTART; //系统调用重新执行
if(sigaction(signum , &act, NULL) == -1){
perror("sigaction");
return -1;
}
pid_t pid = fork();
if(pid == -1){
perror("fork");
return -1;
}
if(pid == 0 ){
pid_t ppid = getppid();
int i;
for(i = 0;i<10;++i){
sigval_t sv;
sv.sival_int = i;
printf("%u进程:向%u进程发送%d信号(附加值=%d)...\n", getpid(),
ppid, signum,sv.sival_int );
if(sigqueue(ppid, signum, sv) == -1){
perror("sigqueue");
return -1;
}
}
printf("%u进程:我将结束\n",getpid());
return 0;
}
if((pid = wait(0)) == -1){ //回收僵尸
perror("wait");
return -1;
}
printf("%u进程:我将结束\n",getpid());
return 0;
}