操作系统实验指导书
5.拓展训练
在进程控制的实验中,结果往往一闪而过,这是为什么?需要如何改进?
13
操作系统实验指导书
实验6进程间的通信实验
1.实验目的
了解Linux系统中进程通信的基本原理。
2.实验设备
计算机、安装了Linux的虚拟机。
3. 实验内容及要求
(1)软中断通信:编制一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程与子进程之间传递消息。
(2)进程的管道通信:编制一段程序,实现进程的管道通信。
4.实验步骤
4.1软中断通信
〈任务1〉
编制一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止:
child process1 is killed by parent! child process2 is killed by parent!
父进程等待两个子进程终止后,输出以下信息后终止: parent process is killed! 〈程序〉
#include
void waiting(),stop(); int wait_mark;
main() {
14
操作系统实验指导书
int p1,p2; if(p1=fork()) /*创建子进程p1*/ { if(p2=fork()) /*创建子进程p2*/ { wait_mark=1; signal(SIGINT,stop); /*接收到^c信号,转stop*/ waiting(); kill(p1,16); /*向p1发软中断信号16*/ kill(p2,17); /*向p2发软中断信号17*/
wait(0); /*同步*/ wait(0); printf(\ exit(0); } else { wait_mark=1; signal(SIGINT,stop); waiting(); lockf(1,0,0); printf(\ is killed by parent!\\n\ lockf(1,0,0); exit(0); } } else { wait_mark=1; signal(SIGINT,stop); waiting(); lockf(1,0,0); printf(\ lockf(1,0,0); exit(0); } }
void waiting() { while (wait_mark!=0); }
15
操作系统实验指导书
void stop() { wait_mark=0; }
4.2进程的管道通信
〈任务2〉
编制一段程序,实现进程的管道通信。使用系统调用pipe()建立一条管道线。两个子进程p1和p2分别向通道个写一句话:
child1 process is sending message! child2 process is sending message!
而父进程则从管道中读出来自两个进程的信息,显示在屏幕上。
〈程序〉
#include
main( ) { int fd[2];
char outpipe[100],inpipe[100];
pipe(fd); /*创建一个管道*/ while ((pid1=fork( ))==-1); if(pid1==0) {
lockf(fd[1],1,0);
sprintf(outpipe,\ /*把串放入数组outpipe中*/
write(fd[1],outpipe,50); /*向管道写长为50字节的串*/ sleep(5); /*自我阻塞5秒*/ lockf(fd[1],0,0); exit(0); } else
{
while((pid2=fork( ))==-1); if(pid2==0)
{ lockf(fd[1],1,0); /*互斥*/
sprintf(outpipe,\ write(fd[1],outpipe,50); sleep(5);
16
操作系统实验指导书
lockf(fd[1],0,0); exit(0); }
else
{ wait(0); /*同步*/
read(fd[0],inpipe,50); /*从管道中读长为50字节的串*/ printf(\ wait(0);
read(fd[0],inpipe,50); printf(\ exit(0); } } }
5.拓展训练
〈任务3〉//可选作 在上面的任务1中,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),观察执行结果,并分析原因。这里,signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN)分别为忽略键信号以及忽略中断信号。
<程序>
#include
void IntDelete() { kill(pid1,16); kill(pid2,17); EndFlag=1; }
void Int1() { printf(\ exit(0); }
17