发送信号
一般有两种方式发送信号:raise和kill
raise函数原型为:
#include <signal.h> int raise(int sig);
该函数向调用的进程或者线程发送信号,形参sig就是需要发送的信号。
返回值:成功返回0,失败返回非零值。需要说明的是,如果信号导致了处理函数(handler)的调用,该函数会在handler返回以后再返回。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <signal.h> void sig_handler(int sig) { printf("Sig=%d\n",sig); } int main(int argc, char **argv) { signal(SIGALRM,&sig_handler); while(1) { raise(SIGALRM); sleep(1); } return 0; }
这种情况下,自己给自己发送信号。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <signal.h> static int x=0; void sig_handler(int sig) { printf("Sig=%d\n", sig); } int main(int argc, char **argv) { pid_t pid; signal(SIGALRM, &sig_handler); pid = fork(); if (pid == 0) //child { while(1) { x=0;
raise(SIGALRM); sleep(3); } } else { while (1) { printf("Parent:%d\n",x); sleep(2); ++x; } } return 0; }
这个程序是子进程给父进程发送信号,此外,还验证了fork只共享了程序代码,而数据是独自使用的,在parent中,x永远不会被清零,因为子进程的x和父进程的x在fork以后无关了。
另外一个方法是使用kill函数,原型如下:
#include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig);
其中pid是需要发送信号到目标进程的ID,sig 是信号值。文档中说明为:The kill() system call can be used to send any signal to any process group or process,因此适用范围比raise要广很多。
返回值:成功(至少一个信号被发送)时返回0,否则返回-1,并且errno会被设置。