本文主要是介绍(10)《基于Linux的C编程与内核导读》--进程的软中断通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
3.3.2 进程的软中断通信 本节我们编写一个实现软中断通信的程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上发出的中断信号(即按Delete键),当父进程接收到这两个软中断中的某一个后,父进程用系统调用kill()向两个子进程分别发出数值为16和17的软中断信号,子进程获得对应软中断信号后执行相应动作然后终止,父进程调用wait()函数等待两个子进程终止后,输出一些信息,然后结束进程执行。 在此程序中我们用到了几个新的系统调用,如wait(),exit(),kill(),signal()等。其中exit()和kill()容易理解,下面我们重点学习其它两个。 wait()函数常用来控制父进程与子进程的同步。在父进程中调用wait()函数,则父进程被阻塞,进入等待队列,等待子进程结束。当子进程结束时,会向父进程发出SIGCHLD信号。当接收到信号后,父进程提取子进程的终止状态字,从wait()函数返回继续执行原来的程序。 signal()函数允许调用进程控制软中断信号的处理,其具体功能和细节详见内核导读部分对signal()函数的分析。 下面我们就具体编写一个进程软中断通信的例子。 程序3.2如下: /***********本程序用于进程的软中断通信*************/ #include #include int wait_flag; void stop(); int main() { int pid,i,j; pid=fork(); /*创建子进程*/ if(pid>0) /*以下是父进程代码*/ { wait_flag=0; printf("This is parent:/n"); sleep(5); /*父进程等待5秒*/ kill(pid,17); /*向子进程发出信号17*/ printf("The kill signal has send!!/n"); wait(0); /*等待子进程的结束信号*/ printf("The parent is ended!!/n"); } else /*以下是子进程代码*/ { wait_flag=0; printf("This is child:/n"); signal(17,stop); /*若接收到信号17则执行stop函数*/ while(1) /*循环等待*/ { /*若执行了stop函数,wait_flag会变为1,则子进程结束*/ if(wait_flag>0) {printf("The child is ended!!/n"); exit(0); } }/*end of while*/ }/*end of child process*/ return 0; }/*end of main*/ void stop() /*信号执行句柄函数*/ { wait_flag=1; /*若执行此函数,可让全局变量wait_flag变为1*/ } | 结果分析: 下面首先给出编译运行后的一种结果: This is parent: This is child: The kill signal has send!! The child is ended!! The parent is ended!! | 父进程在屏幕上输出This is parent后就进入休眠,等待5秒钟。这时执行子进程,由于父进程还没有发出信号17,因此stop函数还没有得到执行。这样wait_flag仍为0,子进程一直循环等待。当子进程接收到父进程kill发出的信号17后,产生软中断,进而执行句柄函数stop()。软中断返回后wait_flag已经变为1,这样子进程就可以结束了。当父进程的wait()函数接收到子进程的结束信号后也结束了,从而在屏幕上显示了以上的结果。 | |
原文地址 http://www.openlab.net.cn/blogs/zsb/archive/2005/08/29/444396.aspx |
这篇关于(10)《基于Linux的C编程与内核导读》--进程的软中断通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!