signal.h是C标准函数库中的信号处理部分, 定义了程序执行时如何处理不同的信号。信号用作进程间通信, 报告异常行为(如除零)、用户的一些按键组合(如同时按下Ctrl与C键,产生信号SIGINT)。
除了两个信号SIGKILL与SIGSTOP不能被捕获(caught)、阻塞(blocked)或者忽略,其它的信号都可以指定处理函数(handler)。函数kill和raise可以发送信号,其中函数raise发送一个信号给当前进程,函数kill发送一个信号给特定进程。
#include <signal.h> int kill(pid_t pid, int sig); #include <signal.h> int raise(int sig);
raise(sig) == kill(getpid(), sig)
下面用一个实例说明kill函数,父进程向子进程发送SIGUSR1信号,子进程捕获该信息,最后父进程发送SIGINT信息终止子进程,程序结束。
#include <stdio.h> #include <unistd.h> #include <signal.h> #include <time.h> #include <sys/wait.h> void handler(int signo) { time_t t = time(NULL); printf("%d\t%s", signo, ctime(&t)); } int main(void) { pid_t pid = fork(); if(pid < 0) { // Fork error perror("fork error\n"); return 1; } else if(pid == 0) { // Child process if(signal(SIGUSR1, handler) == SIG_ERR) { perror("signal error\n"); return 1; } while(1) pause(); return 0; } else { // Parent process sleep(1); for(int i=0; i<5; i++) { if(kill(pid, SIGUSR1) != 0) { perror("kill error\n"); return 1; } sleep(5); } // Kill child process kill(pid, SIGINT); wait(NULL); return 0; } }
运行结果如下:
[ycxie@fedora Workspace]$ gcc killdemo.c -o killdemo [ycxie@fedora Workspace]$ ./killdemo 10 Wed Nov 14 22:33:32 2018 10 Wed Nov 14 22:33:37 2018 10 Wed Nov 14 22:33:42 2018 10 Wed Nov 14 22:33:47 2018 10 Wed Nov 14 22:33:52 2018