【发布时间】: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 的了解比你多。