进程间的通信就麻烦一些了,信号的种类就有64种,可以在终端中输入kill -l查看!
就先说几个今天刚学的吧
1.SIGINT,这个信号是由硬件产生的,比如按下ctrl+c时就会产生这个信号。
2.SIGALRM,这个信号是由alrm(unsigned int arg)函数产生的,就是间隔arg秒时间后产生SIGALRM信号。
3.SIGCHLD.子进程退出时会产生这个信号。
信号产生后必须有一个函数去接这个信号,这个函数就是signal(int signum,sighandler_t handler)函数。第一个参数是信号类型,比如SIGINT.第二个参数是执行方式,执行方式有3种,SIG_IGN表示忽略信号,SIG_DFL表示按默认执行,还有就是可以填执行函数的入口地址.
必须注意!!!对信号的注册函数signal必须在信号产生之前就已经注册好,还有就是pause()函数可以等待信号的产生.然后再执行后面的代码.
这里就只写一个简单的例子吧
#include <stdio.h> #include <signal.h> #include <stdlib.h> #include <unistd.h> void some_signal(int sig) { if (sig == SIGINT) printf("the ctrl+c signal\n"); else if (sig == SIGALRM) printf("alrm signal\n"); else printf("chile end signal\n"); } int main() { pid_t pid; int i; pid = fork(); switch (pid) { case -1: perror("fork failed!\n"); exit(0); case 0: signal(SIGALRM,some_signal); sleep(1); alarm(1); pause(); break; default: signal(SIGINT,some_signal); signal(SIGCHLD,some_signal); pause(); wait(NULL); } return 0; }
alrm signalchile end signal如果在子进程结束之前按ctrl+c就会打印
the ctrl+c signal这里要注意,在一个进程中用alarm函数,在另一个进程中是收不到信号的,当然不是说SIGALRM不能在不同进程间传递,而是alarm这个函数的原因,如果在子进程用kill(getppid,SIGALRM),父进程signal(SIGALRM,function)就能收到.