[英]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.