c - 从管道(FIFO)读取然后比较字符串

标签 c linux named-pipes

我正在从管道读取数据。

char buf[255];

while((nbytes = read(fd,buf,sizeof(buf)) > 0)) // fd is the opened pipe
        {

          if(strcmp(buf,"IN")==0){
            printf("%s\n", "SET IN");
          }
          if(strcmp(buf,"OUT")==0){
            printf("%s\n", "SET OUT");
          }
}

现在当我通过终端写入管道时

echo "OUT" > /path/to/FIFO

我得到的输出是:“SET IN”

我输入的所有内容总是得到“SET IN”作为输出。我如何将它与我从管道中读取的字符串进行比较?

最佳答案

您将读取的数据视为字符串(通过将其传递给 strcmp()),但无法保证输入数据以 0 结尾。特别是,read() 不会以 0 终止数据,如果可能,它会用数据填充整个缓冲区。

您需要自己完成,将读取调用修改为如下内容:

while((nbytes = read(fd, buf, sizeof buf - 1)) > 0 ) // fd is the opened pipe
{
  buf[nbytes - 1] = '\0';

请注意,传递给 read() 的大小已缩小,以便为终止符腾出空间,我们将添加它。

另请注意,我更正了 while 中的括号,如上面@AhmedMasud 的评论中所述。这是一个很好的观点,我忘了强调它。

更新:如xaxxon's answer所述,数据将以不可预测的 block 形式传送,因此协议(protocol)可能会有用。流经管道的文本数据最简单的协议(protocol)(当然?)是基于行的。这意味着您应该收集数据,直到检测到行尾字符。当你这样做时,解析缓冲区的内容,然后清除它。

关于c - 从管道(FIFO)读取然后比较字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16476502/

相关文章:

c - 结构的大小?

c - 为什么 ftell( stdin ) 导致非法查找错误

c - 扩展模块: marshalling void * to bytearray (and/or vice versa)

php - Laravel 5 - 返回 View

linux - linux 上的 eclipse-mars : black background color in Tooltip's

windows - 可执行文件从命名管道开始?

c++ - 使用 C++ 的命名管道

c - 程序错误之间的字符串

linux - 使用 SSH 时未得到正确的提示

c++ - 如何将 wstring 缓冲区发送到子进程的标准输入?