进程软中断通信资料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
进程软中断通信
【预备知识】
进程软中断通信涉及的系统调用描述如下。
1.kill()
进程用kill()向一个进程或一组进程发送一个信号。系统调用格式为int
kill(pid,sig)。其中,pid是一个或一组进程的标识符,sig是要发送的软中断信号。信号的发送分如下三种情况。
pid>0时,核心将信号发送给进程pid。
pid=0时,核心将信号发送给与发送进程同组的所用进程。
pid=-1时,核心将信号发送给所有用户标识符真正等于发送进程的有效用户标识号的进程。
2.signal(sig,function)
接收信号的程序用signal()来实现对处理方式的预置,允许调用进程控制软中断信号。系统调用格式为signal(sig function),此时需包含头文件signal.h。其中,sig用于指定信号的类型,sig为0则表示没有收到任何信号,其余类型如表所示。
调用函数使用如下头文件:
#include
参数定义如下:
signal (sig,function)
int sig;
void(*func) ();
function是该进程中的一个函数地址,在核心返回用户态时,它以软中断信号的序号作为参数调用该函数,对除了信号SIGKILL、SIGTRAP和SIGPWR以外的信号,核心自动重新设置软中断信号处理程序的值为SIG_DFL,进程不能捕获SIGKILL信号。
function的解释如下:
(1)function=1时,进程对sig类信号不做任何处理便立即返回,亦即屏蔽该类型号。
(2)function=0时,默认值,进程收到sig信号后终止自己。
(3)function为非0、非1类整数时,执行用户设置的软中断处理程序。
信号的类型
编程实现例<一>
【任务】
编程实现,父进程生成子进程,父进程发送信号并等待,子进程接收信号并完成某种功能,然后自我终止并唤醒父进程。
【程序】
#include
#include
#include
int func();
main()
{
int i,j;
signal(17,func);
if(i=fork())
{
printf(“Parent: Signal 17 will be send t to Child! \n ”) kill(i,17);
wait(0);
printf (“Parent: finished! \n”);
}
else
{
sleep(10);
printf(“Child: A signal from my Parent is received ! \n”); exit();
}
}
func()
{
printf(“It is signal 17 processing function ! \n”)
}
【运行结果】
【分析】
编程实现例<二>
【任务】
编制一程,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即DEL键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止。
child process 1 is killed by parent!
child process 2 is killed by parent!
父进程等待两个子进程终止后,输出以下信息后终止。
Parent process is killed!
【程序】
#include
#include
#include
int waiting(),stop();
int wait_mark;
main()
{
int p1,p2;
while ((p1=fork())==-1);
if (p1>0)
{
while ((p2=fork())==-1);
if (p2>0)
{
printf(“parent\n”);
wait_mark=1;
signal(SIGINT,stop); /*接收DEL信号,并转stop()*/
waiting();
kill(p1,16); /*向P1发中断信号16*/
kill(p2,17); /*向P2发中断信号17*/
wait(0);
wait(0);
printf(“parent process is killed!\n”);
exit(0)
}
else
{
printf(“p2\n”);
wait_mark=1;
signal(17,stop)
waiting();
lockf(stdout,1,0);
printf(“child process 2 is killed by parent!\n”);
lockf(stdout,0,0);
exit(0);
}
}
else
{
printf(“p1\n”);
wait_mark=1;
signal(16,stop)
waiting();
lockf(stdout,1,0);
printf(“child process 1 is killed by parent!\n”);
lockf(stdout,0,0);
exit(0);
}
}
void waiting()
{
while (wait_mark!=0);