Can';t使用管道打印字符串

Can';t使用管道打印字符串,c,pipe,C,Pipe,我正在尝试我的第一个管道工程:基本上我已经编写了一个程序,应该在屏幕上显示输入的内容。问题是只打印了几个字符(通常只是第一个字符),我真的很难弄清楚原因。我的代码是: 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 = rea

我正在尝试我的第一个管道工程:基本上我已经编写了一个程序,应该在屏幕上显示输入的内容。问题是只打印了几个字符(通常只是第一个字符),我真的很难弄清楚原因。我的代码是:

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);
    }

}
操作员
的优先级高于
=
<代码>管道读取将具有以下表达式的值:

read(fd[0], buf, BUFFERSIZE) > 0
根据比较结果,这是1或0。这就是为什么
write
只打印一个字符

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

非常感谢。这是一件非常愚蠢的事情,我完全忽略了它。您的终止条件至少在两个方面有点不合适-1)它只查看潜在的
BUFFERSIZE
大小的输入集合的前四个字节,2)它假设
n=read(…)
返回的值大于4…@twalberg感谢您的注释。所以你的建议是我用BUFFERSIZE和。。。恐怕我不明白第2点,请你帮我把它哑一点好吗?
read()
可以返回,例如,2,即使你请求了
BUFFERSIZE
,在这种情况下,你的
strncmp()
尝试读取
read()
返回的内容的末尾。而且,不,不要仅仅用
BUFFERSIZE
替换4,您需要实际扫描返回的数据量,看看您的搜索短语是否在其中,而不仅仅是在开头。一次迭代在缓冲区结束时返回
st
,下一次迭代在缓冲区开始时返回
op
,这也可能使问题变得复杂。。。换句话说,事情并不是那么简单。好吧,谢谢你!:)如果您的编译器没有警告您这个问题,您需要打开更多的警告,或者需要使用更好的编译器。使用
gcc
,使用
-Wall
并修复代码,使其不会出错。如果您也使用
-Wextra
会更好。如果编译器确实给了您警告,请注意它所说的内容。记住,它比你更了解C。
while ((pipe_read = read(fd[0], buf, BUFFERSIZE)) > 0)