哈尔滨理工大学课程设计报告
父进程从管道中读出来自于两个子进程的信息,显示在屏幕上。 要求父进程先接收子进程P1的消息,再接收子进程P2的消息。
2.4 流程图
创建管道创建子进程p1NoP1 = 0Yes“Message from Child l !”放入缓冲区中把缓冲区所指内容写入50个字节到fd[1]指定的文件No创建子进程p2P2 = 0Yes“Message from Child 2 !”放入缓冲区中把缓冲区所指内容写入50个字节到fd[1]指定的文件父进程从管道读出长度为50字节的字符串,并打印 2.5 主要程序代码
#include
#include
int pid1,pid2;// pid_t pid1,pid2; main( ) {
int fd[2]; // 打开文件的文件描述符数组fd[0]读,fd[1]写; char outpipe[100],inpipe[100];
pipe (fd); // 先创建管道,再创建子进程
哈尔滨理工大学课程设计报告
while ((pid1 = fork( )) == -1); // fork () = -1创建子进程失败 if (pid1 == 0) // Child1 {
lockf (fd[1],1, 0); // 建立互斥文件锁
sprintf (outpipe,\ // 把串放入数组outpipe中
write (fd[1], outpipe, 50); // 把outpipe所指内存写入50个字节到fd[1]的文
件;
sleep (5); /*自我阻塞5秒*/ lockf (fd[1],0,0); // 解除互斥文件锁 exit (0); }
else // pid1 > 0 { while ((pid2 = fork ( )) == -1); if (pid2 == 0) // Child2 {
lockf (fd[1],1, 0); /*互斥*/
sprintf (outpipe,\ write (fd[1], outpipe, 50); sleep (5);
lockf (fd[1], 0, 0); exit (0); }
else // pid1 > 0 && pid2 > 0,父进程 {
read (fd[0], inpipe, 50); /*从管道中读长为50字节的串*/ printf (\ wait (0);
read (fd[0], inpipe, 50); printf (\ exit (0); }
wait (0); /*同步*/
哈尔滨理工大学课程设计报告
}}
1.6 运行结果及分析
父进程先接收子进程1的消息再接受子进程2的消息,并打印。
1.7 心得体会
通过本次实验,掌握了如何创建管道以及利用管道方式进程间通信。
哈尔滨理工大学课程设计报告
题目3 进程间通信设计
3.1 题目的主要研究内容及预期达到的目标
利用消息队列实现进程间的通信。
3.2 题目研究的工作基础或实验条件
(1)硬件环境:Linux平台。 (2)软件环境:标准C语言。
3.3 设计思想
使用系统调用msgget(),msgsnd(),msgrev()及msgctl()编制度为512B的消息的发送和接收程序。
3.4 流程图
一长
哈尔滨理工大学课程设计报告
用ftok函数建立IPC通信需要的ID值发送端用ftok函数返回IPC通信需要的ID值接收端用msgget函数返回队列标识符用msgget函数创建消息队列并返回标识符向缓冲区中输入1K的字符串消息清空接收缓冲区用msgsnd函数发送消息到消息队列用msgrcv函数接收消息队列中消息 3.5 主要程序代码
发送方主要代码:
int main (int argc, char **argv) { int msqid ;
struct msgbuf buf ;
int flag ; // 发送消息返回值0:成功; int key ; // 创建IPC通讯ftok出的键值;
int sendlength ; // 发送消息的大小,不含消息类型long占用的4个字节; key = ftok (\返回系统建立IPC通讯时需要的ID值; if ( key < 0 ) {
perror (\ return -1 ; }
msqid = msgget ( key, 0600 | IPC_CREAT ) ; // 创建队列对象并返回标识符; if ( msqid < 0 ) {
perror (\ return -1 ; }
buf.mtype = 1 ;