我正在从管道读取数据。
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/