#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
int ch;
pid_t p = fork();
if (p == 0) {
do {
ch = getchar();
} while (ch >= 0);
return 0;
}
int s;
waitpid(p, &s, 0);
printf("A done\n");
p = 0;
do {
ch = getchar();
} while (ch >= 0 && (++p));
printf("chars: %d\n", p);
return 0;
}
这是最少的示例代码。从理论上讲,它应该读取一些字符直到EOF,然后打印A done
,再读取一些字符,并向您显示A done
之后有多少个字符。
但是,在我的Linux Windows子系统(Ubuntu 18.04)上,当我第一次按Ctrl-D时,两者都退出了子进程和父进程(收到EOF)。我得到的输出是类似的
asdfghjkl
^DA done
chars: 0
那是为什么?以及我该如何解决?
答案 0 :(得分:0)
在fork(2)
中,文件描述符是dup(2)
的对象,因此它们共享相同的文件指针,因此,其中一个进程读取的内容不会被另一个进程读取。