当前位置: 技术问答>linux和unix
fifo open的问题
来源: 互联网 发布时间:2016-05-25
本文导语: 当O_NONBLOCK置位时,只读open立即返回。当只写open时,如果没有进程为读打开FIFO,则返回–1,并置errno值为ENXIO。 进程1和2通过fifo进行通信,1来读,2来写,在每个进程中mkfifo两个fifo,一个读,一个写。由于当...
当O_NONBLOCK置位时,只读open立即返回。当只写open时,如果没有进程为读打开FIFO,则返回–1,并置errno值为ENXIO。
进程1和2通过fifo进行通信,1来读,2来写,在每个进程中mkfifo两个fifo,一个读,一个写。由于当只写open时,如果没有进程为读打开FIFO,则返回–1,并置errno值为ENXIO。因此我通过让1先写一个命令到fifo,2从fifo读出此命令后写数据到fifo,然后1再来读取。现在的问题是,进程1一直在后台运行,2手动启动。当第一次1发命令给2的时候能读出正确数据,然后2终止。接着2重启,1再次发命令使2写新数据到fifo后读出的却是上次的数据,再发次命令读一次就可读出新数据。
我想是不是因为“在读FIFO管道数据时,默认的是一次性读取PIPE_BUF个字节,当管道中数据多于PIPE_BUF个字节时,一次性读出PIPE_BUF-1个字节”。因此我想在每次查询前先清空fifo的数据,在每次1通知2写数据前,循环读出所有fifo中的数据,这是的只读open和read都不会阻塞吧?会不会影响后面的发命令读写fifo?
进程1和2通过fifo进行通信,1来读,2来写,在每个进程中mkfifo两个fifo,一个读,一个写。由于当只写open时,如果没有进程为读打开FIFO,则返回–1,并置errno值为ENXIO。因此我通过让1先写一个命令到fifo,2从fifo读出此命令后写数据到fifo,然后1再来读取。现在的问题是,进程1一直在后台运行,2手动启动。当第一次1发命令给2的时候能读出正确数据,然后2终止。接着2重启,1再次发命令使2写新数据到fifo后读出的却是上次的数据,再发次命令读一次就可读出新数据。
我想是不是因为“在读FIFO管道数据时,默认的是一次性读取PIPE_BUF个字节,当管道中数据多于PIPE_BUF个字节时,一次性读出PIPE_BUF-1个字节”。因此我想在每次查询前先清空fifo的数据,在每次1通知2写数据前,循环读出所有fifo中的数据,这是的只读open和read都不会阻塞吧?会不会影响后面的发命令读写fifo?
|
fifo的描述被设计成一个可以当成一个文件描述符来用,不知道为什么没有支持open的时候的O_TRUNC参数.看上去实现应该是很简单的了.可以试试open的时候加O_APPEND参数可不可以满足你的要求.
实在不行的话只有任务1启动的时候先打开fifo,然后循环读到读不出数据才通知任务2可以开始写数据.
实在不行的话只有任务1启动的时候先打开fifo,然后循环读到读不出数据才通知任务2可以开始写数据.