【问题标题】:Pipe in C - scanf seems to be not working when reading from pipeC中的管道-从管道读取时scanf似乎不起作用
【发布时间】: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",...)` 也会产生问题。您不能有两个没有分隔符的连续数字。它将被扫描为一个大数字。

标签: c fork pipe scanf


【解决方案1】:

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

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

那么你还需要在输出的末尾添加一些空格(不管是哪个),因为scanf会等待一个空格或EOF:

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

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

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

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

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

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

【讨论】:

  • 如果我写 printf("parent process") 而不是 prinf("parent process\n"),则消息不会打印到终端屏幕上。但是,如果我写 printf("child process") 而不是 printf("child process\n"),则消息仍会打印到终端上。那么为什么有时即使没有写“\n”也会刷新标准输出?
  • @nnori 在printf("child process") 的情况下,该过程随后在exit(0) 结束。那时,每个流都被刷新和关闭,所以你会看到它被打印出来。在printf("parent process") 的情况下,由于在重定向之前不刷新,包含parent process1 2 的完整缓冲区被发送到子进程而不是打印到终端。
猜你喜欢
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 2017-07-22
相关资源
最近更新 更多