【问题标题】:Can't print strings using a pipe无法使用管道打印字符串
【发布时间】:2013-06-06 17:33:50
【问题描述】:

我正在尝试进行我的第一个管道工作:基本上我已经编写了一个程序,该程序应该在屏幕上显示输入的内容。问题是只打印了几个字符(通常只打印第一个字符),我真的很挣扎明白为什么。我的代码是:

if ( pid > 0 ) //If I'm the parent
{
    close(fd[0]);
    //as long as something is typed in and that something isn't 
    // the word "stop"
    while (((n = read(STDIN_FILENO, buffer, BUFFERSIZE)) > 0) && 
           (strncmp(buffer, "stop", 4) != 0))
    {
        //shove all the buffer content into the pipe
        write(fd[1], buffer, n);
    }

}
else //If I am the child
{
    close(fd[1]);

    //as long as there's something to read
    while (pipe_read = read(fd[0], buf, BUFFERSIZE) > 0)
    {
        //display on the screen!
        write(STDOUT_FILENO, buf, pipe_read);
    }

}

【问题讨论】:

  • 您的终止条件至少在两个方面似乎有点偏离 - 1)它只查看可能 BUFFERSIZE 大小的输入集合的前四个字节,以及 2)它假设 @ 987654323@ 返回大于 4 的值...
  • @twalberg 谢谢你的笔记。所以你的建议是我用 BUFFERSIZE 代替 4 并且......恐怕我没有得到第 2 点,请你帮我把它简化一下好吗?
  • read() 被允许返回,例如2,即使您请求了BUFFERSIZE,在这种情况下,您的strncmp() 也会尝试读取read() 返回的内容的末尾。而且,不,不要只用BUFFERSIZE 替换4,您需要实际扫描返回的数据量,看看您的搜索短语是否在其中的任何位置,而不仅仅是在开头。它也可能因为一次迭代在缓冲区末尾返回st 而下一次迭代在开始时返回op 而变得复杂......换句话说,它没有那么简单。
  • 好的,谢谢! :)
  • 如果你的编译器没有警告你这个问题,你要么需要打开更多的警告,要么你需要一个更好的编译器。使用gcc,使用-Wall 并修复代码,使其不会出错。如果你也使用-Wextra 会更好。如果编译器确实给了您警告,请注意它所说的内容。请记住,它对 C 的了解比你多。

标签: c pipe


【解决方案1】:
while (pipe_read = read(fd[0], buf, BUFFERSIZE) > 0)

运算符> 的优先级高于=pipe_read 将具有表达式的值:

read(fd[0], buf, BUFFERSIZE) > 0

即1或0,根据比较的结果。这就是write 只打印一个字符的原因。

while ((pipe_read = read(fd[0], buf, BUFFERSIZE)) > 0)

【讨论】:

  • 谢谢。这太愚蠢了,我完全错过了。
猜你喜欢
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多