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)