操作系统进程间通信
实验项目名称 实验五:进程间通信
实验目的 1、了解什么是信号
2、熟悉LINUX系统中进程之间软中断通信的基本原理
实验要求 1.熟悉kill(),signal()的调用
2.理解进程间通信方式
3.完成思考题
实验原理 1、kill( )
系统调用格式
int kill(pid,sig)
参数定义
int pid,sig;
其中,pid是一个或一组进程的标识符,参数sig是要发送的软中断信号。
(1)pid>0时,核心将信号发送给进程pid。
(2)pid=0时,核心将信号发送给与发送进程同组的所有进程。
(3)pid=-1时,核心将信号发送给所有用户标识符真正等于发送进程的有效用户标识号的进程。
2、signal( )
预置对信号的处理方式,允许调用进程控制软中断信号。
系统调用格式
signal(sig,function)
头文件为
#include <signal.h>
参数定义
signal(sig,function)
int sig;
void (*func) ( )
function 的解释如下:
(1)function=1时,进程对sig类信号不予理睬,亦即屏蔽了该类信号;
(2)function=0时,缺省值,进程在收到sig信号后应终止自己;
(3)function为非0,非1类整数时,function的值即作为信号处理程序的指针
实验仪器 装linux的pc机一台
实验步骤 1.编写5.C
2.#gcc -o 5 5.C
3.#./5
4.^c
实验内容 #include <stdio.h>
#include <signal.h>
#include <unistd.h>
void waiting( ),stop( );
int wait_mark;
main( )
{
int p1,p2,stdout;
while((p1=fork( ))= =-1); /*创建子进程p1*/
if (p1>0)
{
while((p2=fork( ))= =-1); /*创建子进程p2*/
if(p2>0)
{
wait_mark=1;
signal(SIGINT,stop); /*接收到^c信号,转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
{
wait_mark=1;
signal(17,stop); /*接收到软中断信号17,转stop*/
waiting( );
lockf(stdout,1,0);
printf("Child process 2 is killed by parent!\n");
lockf(stdout,0,0);
exit(0);
}
}
else
{
wait_mark=1;
signal(16,stop); /*接收到软中断信号16,转stop*/
youerw.com
printf("Child process 1 is killed by parent!\n");
lockf(stdout,0,0);/*是一个用于进程互斥的实用例程lockf(fd,mode,size),其功能是将文件fd的指定区域进行加锁和解锁,以解决临界资源文件的竞争问题*/
exit(0);
}
}
void waiting( )
{
while(wait_mark!=0);
}
void stop( )
{
wait_mark=0;
}
实验数据 按下^C后,显示 Parent process is killed!
实验总结 再上述程序中,signal()都放在一段程序的前面部位,而不是再其他接受信号处。这是因为signal()的执行是为进程制定信号值16货17的作用,以及分配相应的与stop()过程连接的指针。因而,signal()函数必须在程序前面部分执行。
1、在wait( )前如已有一个子进程暂停或终止,则调用进程做适当处理后便返回,那么第二个wait()就用来等待第二个子进程结束。
2、exit(0);表示进程正常结束。178