【发布时间】:2014-02-25 03:58:34
【问题描述】:
我编写了以下程序来了解管道在 C 中是如何工作的。但它没有产生预期的输出。我使用管道将父进程的标准输出连接到子进程的标准输入。为此,我使用了 printf 和 scanf。但是子程序似乎在等待输入,而不是使用 scanf 读取它。 代码跟在问题后面。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
int main(){
int pipefd[2];
pipe(pipefd);
int pid = fork(); // --- fork here ---
if (pid == 0){ // child process
printf("child process\n");
int a=0, b=0;
close(pipefd[1]);
dup2(pipefd[0],0);
close(pipefd[0]);
scanf("%d%d", &a, &b);
printf("%d%d", a, b);
exit(0);
}
else{ // parent process
printf("parent process\n");
close(pipefd[0]);
dup2(pipefd[1],1);
close(pipefd[1]);
printf("%d%d", 1, 2);
wait(NULL);
}
return 0;
}
预期输出: 父进程 子进程 12
实际输出: 父进程 子进程
【问题讨论】:
-
您是否尝试在从父级打印时添加换行符?
-
在父级的 printf 之后添加
fflush(stdout);,在每个数字之后的 printf 中添加非数字字符。现在我看到你的`scanf("%d%d",...)` 也会产生问题。您不能有两个没有分隔符的连续数字。它将被扫描为一个大数字。