操作系统实验-基于命名管道的进程通信

3.1需求分析

进程A向进程B传递一个复杂的结构数据,至少包括两类成员:整数型,字符串型。B接收到数据后,将其中的字符串逆序后,再将数据发送给进程A。

即在进程A中创建一个结构体my_message,该结构体包含char数组words和整形数据key,要求将进程A中的结构体序列化后经管道传送给进程B,由进程B反序列化后输出,并将结构体中的words逆序通过管道返回给进程A。

输入:在进程A的终端输入结构体的信息,包括字符串和整型数据。

输出:进程B的终端显示由进程传入的结构体信息,并在进程A中显示返回的逆序字符串信息。

3.2概要设计

由于进程通信以及字符处理涉及到很多头文件的引入,故使用统一的头文件con.h进行管理,头文件中con.h包含一些变量的声明(fifo文件的命名以及字符缓冲区输入的大小),以及string.h,stdlib.h头文件,便于进行字符串的复制,转化(数字和字符数组)及连接,和必要的管道文件。

结构体my_message,以及输出结构体信息的函数print_message(struct my_message m),进程A通过以及进程B主要通过main函数完成所需功能。

对于通信过程,首先调用mkfifo函数创建相应的fifo文件,即fifo1和fifo2,用于进程A和进程B之间的双向通信。同时进行必要的错误处理(重要,用于判断程序运行到哪一步出错了),然后进程获取管道的文件句柄(设置为只有写或读权限)以完成通信和必要处理。

3.3详细设计

模块一:print_message

该模块接受结构体my_message,逐行输出结构体的字符内容和整型数据

模块二:reverse

该模块接收字符串左右指针位置,设置left和right,通过交换left和right所指向的字符实现逆序。在循环中,left递增,right递减。

模块三:进程A的main函数

  1. :定义message结构体,以及管道缓存buf,和字符数组strk。

  1. :调用mkfifo创建进程A向进程B通信的命名管道fifo1。

  1. :从键盘输入结构体的信息,并调用print_message函数输出结构体信息。

  1. :将结构体序列化至buf中,首先调用库函数sprintf将message.key转为strk,接着调用strcpy和strcat完成对结构体的序列化,内容存在buf数组中

  1. :打开管道,进行通信,同时在收到进程B所传送的消息后,打印输出并关闭管道,结束通信。

模块四:进程B的main函数

  1. :设置buf,以及逆序返回的数组rebackmes和用于进行字符数字转换的strk数组。

  1. :调用mkfifo创建进程B向进程A通信的命名管道fifo2。

  1. :通过open函数打开管道fifo1和fifo2。

  1. :读取fifo1中的buf数据,通过for循环对buf中的数字和字符分割

其中,数字赋值给strk,字符赋值给rebackmes。

  1. :调用strcpy和atoi库函数完成对进程B中的结构体的赋值(反序列化)。

  1. :通过reverse函数对rebackemes字符数组逆序并返回给进程A。最后关闭管道,结束通信。

3.4调试分析

分析一:mkfifo创建fifo失败

当运行一次程序之后再次运行程序会提示创建fifo失败,需注意,第一次运行程序时已经创建了fifo文件,而使用mkfifo创建fifo文件时,需确保该文件不存在,否则会出现冲突而创建失败。若需二次运行时需要删除初次运行时产生的fifo文件,才可以第二次运行。

同时注意mkfifo需要在main函数前执行,而不能放在scanf后,否则程序会卡死。

分析二:结构体是否应在进程B中实例化

进程A和进程B都需要创实例化my_message结构体,为了使程序更健壮,若在进程B中不实例化该结构体,只对数据进行处理,而用户并不知情,可能会输出相反的顺序,造成程序输出错误,不能为了简化编写,而省略进程B的实例化过程。

分析三:linux系统向windows文件系统复制文件失败

Linux系统可以访问Windows系统的文件,而Windows系统无法访问Linux文件,移动con.h这个文件时,在Linux系统中显示文件移动失败。需注意con是windows系统的保留字,需将代码命名改为con1.h。

a.c

b.c

con1.h

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值