用管道实现父进程给两个子进程传输数据,只有先调度的可以接收到

本文探讨了在父进程使用fork()两次后,产生的两个子进程如何与父进程通过管道进行通信的问题。实验结果显示,只有先被调度的子进程能够接收到父进程通过管道发送的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

父进程fork()两次之后,产生了两个子进程,父进程向管道里写数据,子进程读取,两个子进程都能读取到还是先运行的那个可以读取到。

代码如下:

结果如下:

 所以可见,只有一个子进程可以获得管道内的数据,先调度的先获得。

二、实验内容: 1. 进程的创建 编写一段程序,使用系统调用fork()创建个子进程。当此程序运行时,在系统中有一个父进程个子进程活动。让每一个进程在屏幕上显示一个字符,记录屏幕上的显示结果,并分析原因。 修改程序,将每个进程输出一个字符改为每个进程输出一句话,观察程序执行时的显示结果,并分析原因。 思考:每个进程输出一个字符和输出一句话,执行结果是否相同,为什么。 2. 进程的控制 在程序中使用系统调用lockf()给每一个进程加锁,来实现进程之间的互斥,观察并分析出现的现象。 思考:加锁后,执行结果有否变化,为什么。 3. 进程的软中断通信 (1)编制一段程序,使其实现进程的软中断通信。 要求:使用系统调用fork()创建个子进程,再使用系统调用signal()让父进程捕捉来自键盘的中断信号(即按Delete键)。当捕捉到中断信号后,父进程使用系统调用kill()向个子进程发出信号。子进程捕捉到信号后分别输出下列信息后终止: child process 1 is killed by parent! child process 2 is killed by parent! 父进程等待个子进程终止后,输出下列信息后终止: parent process is killed! 思考:(1)程序中出现次wait(0),作用是什么? (2)在上面的程序中增加语句signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_ IGN),观察执行结果,并分析原因。 4. 进程管道通信 编制一段程序,实现进程管道通信。 使用系统调用pipe()建立一条管道个子进程 P1和 P2分别向管道各写一句话: Child process 1 is sending a message! Child process 2 is sending a message! 父进程管道中读出来自个子进程的信息,显示在屏幕上。 要求:父进程接收进程 P1发来的消息,再接收进程 P2发来的消息。 思考:进程管道通信有什么特点? 5. 进程间通信 Linux系统的进程间通信允许在任意进程间大批量地交换数据。 (1) 消息的创建、发送和接收。 使用系统调用 msgget()、msgsnd()、msgrcv()及 msgctl(),编制一个发送和接收长度为1KB的消息的程序。 (2)共享存储区的创建、附接和断接 使用系统调用shmget()、shmat()、shmdt()和shmctl(),编制一个与上述功能相同的程序。
最新发布
05-12
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值