【问题标题】:Reading chars from a pipe in C从 C 中的管道读取字符
【发布时间】:2015-10-16 15:27:27
【问题描述】:

此程序读取文件的内容并通过管道发送它们。我无法从子进程中的管道读取。我的输出文件方形字符中的内容。我想我必须将 c 从地址更改为值?

if (pid > 0) {  /* parent */
/* close the end of the pipe we do not need */
close(pfd[0]);

/* read from the input file and write to the pipe */
while ((c = getc(from)) != EOF){
    if (flipping){ 
        c = flipChar(c);
        write(pfd[1],&c, 1);
    }
    else
        write(pfd[1],&c, 1);

 }

  fclose(from);
  close(pfd[1]);

  wait(NULL);
 }
 else{  /* child process */

      close(pfd[1]);

      while (c = read(pfd[0],&c,1))
      {
      /* change c from a address to value?? */
      putc(c, destfile);
      }

      fclose(destfile);
      close(pfd[0]);
 }

 return 0;
 }          

【问题讨论】:

  • 任何错误输出? “遇到麻烦”的本质是什么?

标签: c char pipe


【解决方案1】:

read() 返回读取的字符数。所以你执行read(pfd[0], &c, 1),它将一个字符存储在c 中,然后立即用值1 覆盖该字符(因为你从管道中读取了一个字符)。

【讨论】:

  • 所以 read() 函数是我不应该使用的东西?我应该在我的代码中进行哪些更改,以便我从父进程传递的字符在子进程中被拾取?
  • 你正在从你的管道中拾取角色。你正确地调用了read(),并且你在c中存储了一些东西。这都很好。但是在这样做之后,您将继续覆盖刚刚存储的字符,因为您还使用了read() 生成的返回码(这与您从管道中读取的字符相同)并将其也转储到c
  • 换一种说法:你为什么期望read()从管道中返回下一个字符,因为你传递了一个缓冲区来存储东西?如果您想一次读取 2 个或更多字符,您希望 read() 的返回值是多少?
  • 所以“&c”是我的缓冲区,我想要的字符存储在其中?如何从缓冲区中取出这些并将它们打印到我的文件中。
  • 非常感谢,在阅读了您所说的更多内容后,我设法弄清楚了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多