【发布时间】:2016-06-06 12:16:11
【问题描述】:
代码如下:
// after fork:
else if (pid > 0) // parent
{
char buff[READ_SIZE];
write(STDOUT_FILENO, "parent\n", 7);
int r = read(STDIN_FILENO, buff, READ_SIZE);
if (r == -1)
perror("parent");
}
else // child
{
char buff[READ_SIZE];
write(STDOUT_FILENO, "child\n", 6);
int r = read(STDIN_FILENO, buff, READ_SIZE);
if (r == -1)
perror("child");
sprintf(buff, "\n%d", r);
write(STDOUT_FILENO, buff, 2);
}
这是输出:
$ ./forktest
parent
child
abc <-- input goes to parent, parent exits
$ <-- both child and terminal waiting for input, presumably
此时,只要我按下任意键(不按 Enter),我就会得到:
$ ./forktest
parent
child
abc
$
1 <-- the child has read just 1 character
这意味着孩子的 read() 仅在按一次键且没有 Enter 后结束。
这是为什么呢?
PS。我知道正确的做法是让父母为孩子等待()。我只是好奇这里到底发生了什么。
【问题讨论】:
-
你有什么问题?
-
为什么 read() 在一个按键后结束,即使我还没有按下回车键?如果标准输入不再有效,为什么 read() 不返回 -1?
标签: c linux fork stdin system-calls