linux多进程能同时执行吗,linux里多进程能否同时写同一个FIFO

前言

linux里多进程能否同时写同一个FIFO?这个问题,在网络上似乎有很多人早就探讨过了。但是似乎一搜索,总是搜索不到正确的说法。还是写点内容记录下,防止遗忘。

需求是什么

因为FIFO里存放的都是有序字节流数据,多进程写入的数据必须保证原有的字节顺序不变。当然最基本的问题是,是否多个进程可以同时写同一个FIFO,如果多次打开失败,同时写的时候,程序奔溃,就没有必要继续讨论了。

理论和实践

1. 多进程是可以同时打开并同时写同一个FIFO的

FIFO的设计保证了这个需求是可实现执行的。

2. 在同时写FIFO的时候,是有先后顺序的

在多个进程同时写同一个FIFO时,有锁存在,谁拿到锁,谁就可以写入数据,其他进程等待锁释放;

3. 多进程同写一个FIFO的数据字节序问题

这个问题才是关键问题。如果需要保证一个进程每次写入的一个buffer里的数据,不被分割存放。就必须要确保每次写入的数据是完整的一次性写入FIFO里的,即原子性一次写入。因为如果是分2次以上写入,就可能在2次写入中间,被其他一个进程插入另外一个buffer,从而导致FIFO里的数据不是完整存放的。那么是否每次write到FIFO里的数据都是一次性写入FIFO的呢?

网上有很多人做过实验,有的成功了,确实一次原子性写入了;但是又有人说失败了,并非一次完整写入的。

答案

说一次write可以保证完整性的,和不能保证完整性的,都对。因为linux在这里留下一个大小限制。

可以查看PIPE_BUF的定义,linux系统里PIPE_BUF字节默认值是4096(man 7 pipe)。只要小于PIPE_BUF,就可以保证一次写入的完整性,大于PIPE_BUF就不能保证了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值