一、实验目的: 1、了解什么是管道 2、熟悉 UNIX/LINUX 支持的管道通信方式
|
编写程序实现进程的管道通信。用系统调用pipe( )建立一个管道,同时建立两个子进程 P1 和 P2 分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message! 父进程从管道中读出二个来自子进程的信息并显示(要求先接收 P1,后 P2)。 |
三、实验步骤及结果: //把实验运行过程和相关代码,或者实验结果等截图拷贝过来 1、用gedit命令创建c语言文档,编写代码 2、用gcc进行编译与调试 出错的原因在于没有声明头文件: 3、运行时出现的问题:父进程只读出子进程P2写入的信息 原因:在编写子进程P1向管道中写入信息的函数时,调用的函数错误,写入失败,但是可以通过编译,程序能正常运行 【把sprintf弄成了printf,信息无法保存到数组中,从而无法被写入到管道中】 4、程序预期的执行结果为: 【其中两条信息是命令输入后,延迟5秒后一起打印的】 5、令子进程P2写入的信息可能在子进程P1写入的信息前被父进程读到的操作 (1)对父进程的处理操作中,再添加一个wait(0) (2)将所有的sleep(5)注释掉,则此时无法限制子进程P1与P2并发执行的先后顺序 执行结果: 或者 6、经过测试发现,sleep函数与用于解锁时的lockf函数,两者之间的先后顺序改变,对于进程执行的结果没什么影响 子进程P1: 子进程P2: |
1、程序中的 sleep(5)起什么作用? sleep 命令用于在一段指定的时间内(5秒内)暂停当前进程的执行。它的作用是让进程休眠,暂停执行一段时间,然后继续执行后续的指令。如果运行结果没有发生变化,可在进程中使用sleep(5)来挂起进程来查看结果的变化。 2、子进程 1 和 2 为什么也能对管道进行操作? 实验中所用到的无名管道实际上是一个没有路径的临时文件,进程通过该文件的文件描述符来识别它,而子进程会继承父进程的环境和上下文中的大部分内容,包括文件描述符,从而子进程也能对父进程中创建的管道进行操作。
|
进程之间的管道通信实现比较简单,主要涉及到的知识点就是创建管道函数与创建子进程函数之间的配合使用,为了避免写操作时的互斥,需要对进程操作加锁以及解锁,各函数之间配合使用,才能输出预期结果。 |
操作系统实验——进程通信(管道通信)实验
最新推荐文章于 2024-05-16 11:44:30 发布