Linux进程间通信方式----FIFO
2013-04-27 13:54
585 查看
FIFO类似于管道,是一个单向的数据流。不同于管道的是,每个FIFO都有一个路径名与之关联,从而允许无亲缘关系的进程访问同一个FIFO,进行进程间通信。
我按照书上写了一个简单的FIFO通信的例子,主要结构如下:
服务端:
客户端:
执行的过程中发现服务端阻塞在open(FIFO1, O_RDONLY, 0);,客户端阻塞在open(FIFO2, O_RDONL, 0);
之前使用open的时候没遇到过open阻塞的情况,打开open的man手册发现下面这句话:
O_NONBLOCK
When opening a FIFO with O_RDONLY or O_WRONLY set:
* If O_NONBLOCK is set, an open() for reading-only shall return without delay. An open() for writing-only shall return an error if no process currently has
the file open for reading.
* If O_NONBLOCK is clear, an open() for reading-only shall block the calling thread until a thread opens the file for writing. An open() for writing-only
shall block the calling thread until a thread opens the file for reading.
原来服务端的open(FIFO1, O_RDONLY, 0)要等到open(FIFO1, O_RWONLY, 0)之后才会返回,
客户端的open(FIFO1, O_RWONLY, 0)要等到open(FIFO1, O_RDONLY, 0)之后返回,这两个进程相互等待造成了死锁。
解决办法:
调换服务端或者客户端中打开FIFO1和FIFO2的顺序,以相同的顺序打开就能避免死锁。
我按照书上写了一个简单的FIFO通信的例子,主要结构如下:
服务端:
mkfifo(FIFO1, 0777); mkfifo(FIFO2, 0777); open(FIFO1, O_RDONLY, 0); open(FIFO2, O_RWONLY, 0); ....
客户端:
open(FIFO2, O_RDONLY, 0); open(FIFO1, O_RWONLY, 0); ......
执行的过程中发现服务端阻塞在open(FIFO1, O_RDONLY, 0);,客户端阻塞在open(FIFO2, O_RDONL, 0);
之前使用open的时候没遇到过open阻塞的情况,打开open的man手册发现下面这句话:
O_NONBLOCK
When opening a FIFO with O_RDONLY or O_WRONLY set:
* If O_NONBLOCK is set, an open() for reading-only shall return without delay. An open() for writing-only shall return an error if no process currently has
the file open for reading.
* If O_NONBLOCK is clear, an open() for reading-only shall block the calling thread until a thread opens the file for writing. An open() for writing-only
shall block the calling thread until a thread opens the file for reading.
原来服务端的open(FIFO1, O_RDONLY, 0)要等到open(FIFO1, O_RWONLY, 0)之后才会返回,
客户端的open(FIFO1, O_RWONLY, 0)要等到open(FIFO1, O_RDONLY, 0)之后返回,这两个进程相互等待造成了死锁。
解决办法:
调换服务端或者客户端中打开FIFO1和FIFO2的顺序,以相同的顺序打开就能避免死锁。
相关文章推荐
- Linux进程间通信的方式有哪些?
- linux进程间通信之FIFO
- linux进程间通信-有名管道(FIFO)
- Linux学习——进程间通信方式(1)
- Linux下进程间通信机制:FIFO(命名管道)
- Linux进程间通信二--有名管道FIFO
- Linux进程间通信方式简介
- Linux进程间通信(一)匿名管道方式
- linux学习之十七---进程间通信的几种方式
- linux进程间通信方式 -- 共享内存
- Linux进程间通信方式
- Window & Linux 进程间通信方式(IPC)
- Linux--进程间通信(管道及有名管道FIFO)
- Linux进程间通信: FIFO(1)
- Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)
- 【IPC】Linux进程间通信(Inter Process Communication)通信方式
- Linux 进程间通信 - 共享内存shmget方式
- linux 进程间通信方式总结
- MMU作用,linux进程间通信方式 进程切换原因步骤
- linux使用的7种进程间通信方式