进程间通信(IPC)

一,进程间通信的方式**
管道 信号量 共享内存 消息队列 套接字
二,如何用一个管道文件实现两进程间的通信
首先,管道文件分为有名管道和无名管道
有名管道:可以实现任意两进程间的通信
无名管道:实现父子进程间的通信
三,利用有名管道实现两进程间通信代码*
最开始,得先创建一个管道文件:mkfifo xxx(管道文件名)
一)编写代码[编写一个只写文件a.c代码详解]***这里插入图片描述在这里插入图片描述
1.以只写的方式打开管道文件fifo,并将其值赋给fdw(只写的变量),第二步,如果文件打开成功,就打印出fdw的值。打印的只为3(因为标准输入:0,标准输出:1,标准错误输出:2,如若成功,则从第三个开始)

在这里插入图片描述
2.定义一个循环,目的是可以一直从键盘上写数据。
先输出,“请输入数据”,定义一个字符类型的buff[128]数组,并将其先初始化为0,利用fgets()函数,标准输入stdin从键盘上读取数据并将其存入到buff中,读取buff中的128位。
在这里插入图片描述
3.利用字符串比较buff和end,如果buff中的前三个字符与end相等,就跳出循环,直接关闭文件。(因为这句话的意思是用户想退出程序),否则的话,在fdw中写入buff的内容,长度不再是128,而是利用字符串去计算buff长度。(strlen(buff)),最后关闭只写文件。

(二)编写一个只读文件b.c
在这里插入图片描述
详解:
在这里插入图片描述
第一步:同只写文件
在这里插入图片描述
2.定义一个循环,目的是为了可以从内存中不停地读取数据,首先先定义一个字符类型的数组buff【128】,初始化为零,从buff中最多读取127个字符存入fdr中,将读的值的个数赋给n,如果说n=0,就没有字符可以读了,跳出循环,否则的话打印出buff的值,打印出n(即buff个数,算上"\0")
***运行结果
在这里插入图片描述
注意:先运行只读文件,再新打开一个窗口运行只写文件。(曾经错过:一定要在只读文件运行时打开新窗口运行只写文件)
无名管道【半双工,写入管道的数据存在内存之中,而不是磁盘上,因此如果断电的话,数据会丢失】

实现父子进程间通信
在这里插入图片描述
代码详解
在这里插入图片描述
1.这里fd[2]数组代表的是,只读,只写功能,其中fd[0]=read,fd[1]=write.
首先将父进程复制一份,断言复制成功。
在这里插入图片描述
2.如果说,pid是子进程的话,就关闭写的功能(close(fd[0])),只有读的功能.,从buff中最多读取127个字符写入fd[0],打印出子进程中读取的值。关闭只读功能。
3.在这里插入图片描述
如果是父进程,在fd[1]中写入hello.
运行结果
在这里插入图片描述
tips:
1.在这里插入图片描述
2.在这里插入图片描述
3.写端关闭,读read返回值为0
读端关闭,写write会触发信号:SIGPIPE,直接结束程序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值