【问题标题】:Why is it that my pipe does not read in the printf despite replacing stdin?为什么尽管更换了标准输入,但我的管道没有在 printf 中读取?
【发布时间】:2020-02-16 16:02:36
【问题描述】:

目的是使用 dup、dup2 和 pipe 在父子进程之间进行通信。只是为了了解如何使用 dup 和管道。 子进程调用的函数 multby 将数字作为参数 (3) 并将其与用户输入相乘(在本例中为 5,如在父进程中打印)以获得产品。 (应该是 15)

#include <stdio.h> 
#include <unistd.h> 

void main(int argv, char *argc) { 
    int testpipe[2]; 
    pipe(testpipe); 
    int PID = fork(); 
    if (PID == 0) { 
        dup2(testpipe[0], 0); 
        close(testpipe[1]); 
        execl("./multby", "multby", "3", NULL); 
        close(testpipe[0]); 
        close(0); 
    } else { 
        dup2(testpipe[1], 1); 
        close(testpipe[0]); 
        printf("5"); 
        close(1); 
        close(testpipe[1]); 
        wait(NULL); 
    }  
}

这是 multby 的代码。我还添加了一些 fprintf 语句来进行故障排除。特别是,它打印出要相乘的 2 个数字(应该是上面提到的 3 和 5)。

#include <stdio.h>

int main(int argv, char *argc[]) {
  fprintf(stderr,"exec successful\n");
  if (argv < 2) {
    fprintf(stderr, "Usage: %s <factor>\n", argc[0]);
    return 1;
  }      

  size_t a, b;
  sscanf(argc[1], "%zu", &a);
  fprintf(stderr, "a: %zu\n", a);

  if (scanf("%zu", &b) != 1) {
    fprintf(stderr, "No input %zu\n", a);
    return 1; 
  } 
  fprintf(stderr, "b: %zu\n", b);
  printf("%zu", a*b);
  fprintf(stderr, "multby successful\n");
  return 0;
}

但是,这是我的结果: 执行成功 一个:3 无输入 3

5 未从管道的读取端注册。

有人可以告诉我我做错了什么吗?

【问题讨论】:

  • execl() 之后的语句只有在execl() 失败时才会执行。

标签: c pipe dup


【解决方案1】:

您使用printf(“5”); 将数据传递给子节点,但标准输出至少是行缓冲的,因此在发送换行符(或fflush(stdout))之前不会写入任何内容。然后你 close(1); 关闭标准输出,它不会刷新标准 I/O 缓冲区。所以没有任何东西发送给孩子。使用fclose(stdout); 将 5 发送给孩子。

【讨论】:

  • 谢谢!我得到 fflush 和 fclose 接受文件结构,而 dup 返回一个整数。如果我不使用标准输出或标准输入,有没有办法让我从 int 中获取文件结构?我试着做 fclose(fdopen(1, "w"));但它不起作用。
  • 不,没有。我已经看到你的问题How do I get the file pointer that is being referenced by a file descriptor?,我同意那里的 cmets 也说“不”。你在倒退。在类 POSIX 系统上,文件描述符是基本类型,文件流 (FILE *) 是派生类型。您可以找到文件流使用的文件描述符。您无法使用文件描述符找到文件流,因为可能没有文件描述符,并且内核不了解文件流并且无法提供帮助,也没有 API。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 2013-11-04
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多