我编写了以下程序来了解管道如何在C中工作 . 但它没有产生预期的输出 . 我使用管道将父进程的stdout连接到子进程的stdin . 我为此目的使用了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
实际输出:父进程子进程
1 回答
您需要刷新stdout以便通过管道发送缓冲区 . 你可以通过添加
fflush(stdout)
来做到这一点:然后你还需要在输出的末尾添加一些空格(无关紧要),因为
scanf
将等待空格或EOF:另一种刷新输出并一次添加空格的方法可能是在输出中添加换行符:
虽然这似乎有效,但我不能完全确定这是否能保证冲洗管道 .
但是这仍然无法按预期工作,因为打印输出是
12
,由scanf
解释为 one 整数,scanf
将再次无限等待第二个整数 . 所以添加一个分隔符空格: