西北工业大学 《操作系统》 实验报告 目录 《操作系统》 实验报告 .......................................................................... 1 一 基础知识 ........................................................................................ 3 1. 管道 ............................................................................................. 3 2. 管道通信方式.............................................................................. 3 2.1 从管道中读取数据 ............................................................. 3 2.2 向管道中写入数据 ............................................................. 3 二 编程实现进程管道通信 .............................................................. 4 1. 编写程序 ..................................................................................... 4 2. 编译运行 ..................................................................................... 5 三 思考题 ......................................................................................... 6 1. 程序中的 sleep(5)起什么作用 .................................................... 6 2. 子进程 1 和 2 为什么也能对管道进行操作 ............................... 6 参考资料 ................................................................................................. 6 一 基础知识 1. 管道 所谓管道, 是指能够连接一个写进程和一个读进程的、 并允许它们以生产者—消费者方式进行通信的一个共享文件, 又称为 pipe 文件。 由写进程从管道的写入端(句柄 1) 将数据写入管道, 而读进程则从管道的读出端(句柄 0) 读出数据。 管道具有以下特点: 1 ) 管道是半双工的, 数据只能向一个方向流动; 需要双方通信时, 需要建立起两个管道; 2) 匿名管道只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程) ; 3) 单独构成一种独立的文件系统: 管道对于管道两端的进程而言, 就是一个文件, 但它不是普通的文件, 它不属于某种文件系统, 而是自立门户, 单独构成一种文件系统, 并且只存在与内存中。 2. 管道通信方式 2.1 从管道中读取数据 从 pipe 中读取数据会涉及到下面三个问题: (1) 管道读取阻塞: 当进程试图从管道中读取数据时, 进程被挂起直到数据被写入管道; (2) 管道读取结束标志: 当所有的写者关闭了管道的写数据端时, 试图从管道读取数据的调用返回 0, 这意味着文件的结束; (3) 多个读者可能会引起麻烦: 管道是一个队列, 当进程从管道中读取数据之后, 数据就不存在了。 2.2 向管道中写入数据 向 pipe 中写入数据会涉及到下面三个问题: (1) 写入数据阻塞直到管道有空间去容纳新的数据; (2) 写入必须保证一个最小的块大小; (3) 若无读者在读取数据, 则写操作执行失败。 如果所有的读者都已将管道的读取端关闭, 那么对管道的写入调用将会执行 失败。 二 编程实现进程管道通信 编写程序实现进程的管道通信。 用系统调用 pipe( )建立一管道, 二个子进程 P1 和 P2 分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message! 父进程从管道中读出二个来自子进程的信息并显示(要求先接收 P1, 后 P2)。 1. 编写程序 2. 编译运行 三 思考题 1. 程序中的 sleep(5)起什么作用 延迟 5 秒以保证数据完全写入管道内 2. 子进程 1 和 2 为什么也能对管道进行操作 子进程 1 和 2 继承了父进程的所有特性, 子进程 1 和 2 同属于共同的管道, 共同共享资源。 参考资料 《FreeBSD 使用手册》 《实验六》 http://blog.sina.com.cn/s/blog_ac9fdc0b0101jj8x.html Unix: 管道通信的阻塞机制 http://zh.wikipedia.org/wiki/%E7%AE%A1%E9%81%93_(Unix) 管道(Unix) ‐ 维基百科,自由的百科全书 http://www.myexception.cn/linux‐unix/1470564.html Linux 进程间 通信形 式之管道(pipe) ‐ Linux/Unix