繁体   English   中英

使用pipe()和fork()读取文件并输出到控制台/新文件

[英]Using pipe() and fork() to read from a file and output to the console/new file

我正在尝试学习如何使用pipe()和fork()系统调用。 我正在使用管道和叉子创建父进程和子进程,在该进程中,子进程将从文本文件中读取字符,然后通过管道将其发送到父进程,然后将其输出到控制台,并获得所需的结果它将整个文本打印到控制台。 稍后,我将对文件进行一些文本处理,并读取和处理子进程,然后将更新后的文本发送给父进程,但是现在,我只想确保我正确使用pipe()的基础知识。

示例文件:

This is a test file; it is 1 of many.
Others will follow. 

相关代码:

  pid = fork();

  ifstream fin;
  fin.open(inputFilename);
  fin.get(inputChar);

  if (pid == -1)
  {
    perror("Trouble");
    exit(2);
  }
  else if (pid == 0) //child process that reads text file and writes to parent
  {
    close(pipefds[0]);
    while(!fin.eof())
    {
      write(pipefds[1], &inputChar, sizeof(inputChar));
      fin.get(inputChar);
    }

    close(pipefds[1]);

    exit(0);
  }
  else
  {
    close(pipefds[1]);
    read(pipefds[0], readbuffer, sizeof(readbuffer));
    cout << readbuffer << endl;
    close(pipefds[0]);
    exit(0);

  }
      fin.close();

但是,当我编译并运行时,输出始终是变化的长度。 有时它会打印整个文件,而其他时候它只会打印出几个字母或一行的一半。 如。

This i

我尝试浏览手册页并进行更多研究,但找不到任何答案。 我的程序到底在做什么,它有时会从文件中读取所有内容,而其他时候则不会。 任何帮助是极大的赞赏!

似乎您正在尝试通过调用read(2)从管道读取所有数据。 但是,与任何I / O操作一样,这可能总是返回比您请求的字节少的字节。 您应该始终检查read(2)write(2)系统调用(及其他)的返回值,以确保它们按预期方式工作。

在这种情况下,您应该循环播放,直到从子进程收到一些独立的通知,告知它们已完成发送数据。 在这种情况下,这可以通过read(2)返回0来表示,这意味着孩子关闭了管道的末端。

您假设父级可以通过一个read()调用read()子级写入管道的所有内容。 如果子级通过单个write()调用编写所有内容,则对于管道而言,这可能是一个安全的假设,只要总数据大小不超过管道内部缓冲区的大小即可。 在这种情况下,孩子通过许多小写操作发送数据时,这一点也不安全。

父母实际获得多少数据将部分取决于相对于孩子的写操作,其一次read()调用的顺序。 由于这两个是独立的过程,并且您除了管道本身外没有使用任何IPC,因此基本上无法预测父级将成功读取多少数据。

在一般情况下,必须假定读取器将需要执行多个read()调用来读取所有已发送的数据。 它必须继续调用read()并适当地处理结果数据,直到read的返回值指示发生I / O错误或到达文件末尾为止。 注意以及该文件的结束并不意味着只是没有更多的字节,现在是可用的,但没有更多的字节将永远是可用的。 在所有进程都关闭了管道写入端的所有副本之后,就会发生这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM