gpt4 book ai didi

c - C 中的管道 - 从管道读取时 scanf 似乎无法正常工作

转载 作者:太空宇宙 更新时间:2023-11-04 02:05:14 24 4
gpt4 key购买 nike

我编写了以下程序来了解管道在 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

实际输出:父进程子进程

最佳答案

您需要刷新标准输出,以便通过管道发送缓冲区。您可以通过添加 fflush(stdout) 来做到这一点:

printf("%d%d", 1, 2);
fflush(stdout);

然后您还需要在输出的末尾添加一些空格(无论是哪一个),因为 scanf 将等待空格或 EOF:

printf("%d%d ", 1, 2);
fflush(stdout);

另一种刷新输出并一次性添加空格的方法可能是在输出中添加一个换行符:

printf("%d%d\n", 1, 2);

虽然这似乎可行,但我不完全确定这一定能冲洗管道。

然而,这仍然无法按预期工作,因为打印输出是 12,它被 scanf 解释为 one 整数和 scanf 将再次无限等待第二个整数。所以添加一个分隔符空格:

printf("%d %d ", 1, 2);
fflush(stdout);

关于c - C 中的管道 - 从管道读取时 scanf 似乎无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21497315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com