Linux内核设计的艺术-进程间通信-信号
有两个用户进程,一个进程用来接受及处理信号,名字叫做processing。它所对应的程序源代码如下:
#include <stdio.h> #include <signal.h> void sig_usr(int signo) { if(signo == SIGUSR1) printf("received SIGUSR1\n"); else printf("received %d\n",signo); signal(SIGUSR1,sig_usr); } int main(int argc ,char **argv) { signal(SIGUSR1,sig_usr); for(;;) pause(); return 0; }
另一个进程用来发送信号,名字叫做sending。它所对应的源代码如下:
#include <stdio.h> int main(int argc, char **argv) { int pid,ret,signo; int i; if(argc != 3) { printf("Usage:sensig<signo> <pid>\n"); return -1; } signo = atoi(argv[1]); pid = atoi(argv[2]); ret = kill(pid,signo); for(i=0;i<1000000;i++) if(ret !=0) printf("send signal error\n"); }
系统支持两种方式给进程发送信号:一种方式是一个进程通过调用特定的库函数给另一个进程发送信号;另一种方式是用户通过键盘输入信息产生键盘中断后,中断服务程序给进程发送信号。这两种方式的信号发送原理是相同的,都是通过设置信号位图上的信号位来实现。
系统通过两种方式来检测进程是否接受到信号:一种方式是在系统调用返回之前检测当前进程是否接收到信号;另一种方式是时钟中断产生后,其中断服务程序执行结束之前,检测当前进程是否接收到信号。
当用户进程需要处理信号时,进程的程序将暂时停止执行,转而去执行信号处理函数,待信号处理函数执行完毕后,进程程序将从“暂停的现场处”继续执行。
目前处于shell环境中:
第一步:输入如下指令:运行processing进程的程序
[/usr/root]# ./processing & <160> [/usr/root]#第二步:输入如下指令,运行sendsig进程的程序,发送信号SIGUSR1给processing进程。
[/usr/root]# ./sendsig 10 160 received SIGUSR1 [/usr/root]#未完,待续。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。