前言
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就不能保证了。