繁体   English   中英

读取不阻止命名管道

[英]read not blocking on named pipe

我有以下C代码从管道读取然后应该阻止但它永远不会阻止

int pipe_fd;
int res;
int open_mode = O_RDONLY;
char buf[100];
int bytes_read = 0;

memset (buf, '\0', sizeof(buf));
pipe_fd = open(FIFO_NAME, open_mode);

if (access(FIFO_NAME, F_OK) == -1)
{
    res = mkfifo(FIFO_NAME, 0777);
    if (res != 0)
    {
            fprintf (stderr, "Could not create fifo %s\n", FIFO_NAME);  
            exit (EXIT_FAILURE);
    }
}

for(;;)
{        
    do     
    {     
        res = read(pipe_fd, buf, sizeof(buf));
        bytes_read += res;
    }while (res > 0);

    // process data then go back and block
    ............
}

它通过bash脚本中的某些代码发送一个简单的缓冲区,例如'./test 1'

#!/bin/bash

pipe=/tmp/pipe

if [[ ! -p $pipe ]]; then
    echo "Reader not running"
    exit 1
fi

if [[ "$1" ]]; then
     echo "some string" >$pipe
else
     echo "q" >$pipe
fi

我在gdb中运行C代码程序并且最初它在读取时阻塞但是一旦我调用bash脚本C代码不再阻塞,它就会成功地从缓冲区读取数据,然后每次读取时都有0字节读取所以不确定为什么它不再阻塞。 “some string”数据在另一侧正确接收。

我只是需要它坐在那里等待数据处理它然后回去等待更多

我在gdb中运行C代码程序并且最初它在读取时阻塞但是一旦我调用bash脚本C代码不再阻塞,它就会成功地从缓冲区读取数据,然后每次读取时都有0字节读取所以不确定为什么它不再阻塞。 “some string”数据在另一侧正确接收。

0表示EOF。 只有当连接有进程才能读取和写入时,才能读取或写入FIFO。 当没有更多的编写器(您的shell脚本终止)时,读者会通过read()返回EOF来通知读者。

FIFO表现为与shell管道逻辑兼容的方式,例如:

$ mkfifo ./tmp1
$ cat < input > ./tmp1 &
$ cat < ./tmp1 > /dev/null

如果read()不会返回EOF,则第二cat将永远阻止。

我只是需要它坐在那里等待数据处理它然后回去等待更多

在你的C程序中,你必须在read()第一次返回EOF后重新open() FIFO。

PS为您找到了相当不错的FIFO摘要 检查第二页上的表格。

我认为写侧shell脚本每次关闭管道时都会关闭管道。

因此,写脚本需要打开管道并重复使用opended描述符来写东西并最终关闭opended描述符。

你的bash脚本关闭管道,所以C得到一个“eof”条件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM