| 学 号 | 专业 | 计算机科学与技术 | 姓名 | |||||
| 课程名称 | 操作系统实验 | 班级 | 2011级计师(1)班 | |||||
| 实验名称 | 实验五 进程通信 | 课程类型 | 必修类 | |||||
| 一.实验目的: (1)了解Linux系统中进程通信的基本原理; (2)了解和掌握管道通信机制; (3)了解和熟悉消息通信机制、共享存储区机制以及信号通信机制。 二.实验内容 1. 编写一段程序,实现进程的管道通信。 使用系统调用pipe( )建立一条管道,创建两个子进程P1和P2。 让P1和P2分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message! 父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。 要求父进程先接受子进程P1发来的消息,然后再接受子进程P2发来的消息。 2. 消息的创建、发送和接受。 使用系统调用msgget( )、msgsnd( )、msgrev( )及msgctl()编制一长度为1K的消息的发送和接受程序。 3. 共享存储区的创建、附接和断接。(选做) 使用系统调用shmget( )、shmat( )、shmdt( )及shmctl()编制一个与上述功能相同的程序。 4. 编制一段程序,使其实现进程的软中断通信。(选做) 创建两个子进程,让父进程捕捉键盘上来的中断信号(即“ctrl+C”),当捕捉到信号后,父进程使用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止
Child process 1 is killed! Child process 2 is killed! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent process is killed! 三.程序示例 管道通信源代码: #include #include #include Int pid1,pid2; Main() { Int fd[2]; Char outpipe[100],inpipe[100]; Pipe(fd); While ((pid1=fork())==-1; If (pid1==0) { Printf(“child 1 will going on!\\n”); Lockf(fd[1],1,0); Sprintf(outpipe,”child 1 process is sending message!”); Write(fd[1],outpipe,50); Sleep(5); Lockf(fd[1],0,0); Exit(0); } Else { While ((pid2=fork())==-1; If (pid2==0) { Printf(“child 2 will going on!\\n”); Lockf(fd[1],1,0); Sprintf(outpipe,”child 2 process is sending message!”); Write(fd[1],outpipe,50); Sleep(5); Lockf(fd[1],0,0); Exit(0); } Else { Wait(0); Read(fd[0],inpipe,50); Printf(“%s\\n”,inpipe); Wait(0); Read(fd[0],inpipe,50); Printf(“%s\\n”,inpipe); Exit(0); } } } 四. 分析分析实验结果 功能:使用系统调用pipe()建立一条管道线,两个子进程p1和p2分别向管道各写一句话,而父进程从管道中读出来自于两个子进程的信息,显示在屏幕上。 说明:Lockf(files,function,size) 用作锁定文件的某些段或整个文件。其中:files是文件描述符,function是锁定和解锁(1表示锁定;0表示解锁),size是锁定和解锁的字节数,若为0,则表示从文件的当前位置到文件尾。 实验结果: Child 1 will going on! Child 2 will going on! Child 1 process is sending message! Child 2 process is sending message! 五、实验总结 通过本次试验,充分了解了Linux系统中进程通信的基本原理,掌握管道通信机制原理和方法,熟悉运用消息通信机制、共享存储区机制以及信号通信机制。 | ||||||||
| 实验评语: | |||
| 实验成绩 | 教师签名 | ||