【发布时间】:2010-11-12 04:04:16
【问题描述】:
我有一个子进程,它生成一些可变长度的输出,然后使用半双工管道将其发送给父进程。在父级中,如何使用 read() 函数? 由于数据每次可以具有不同的长度,我如何在运行时知道数据的大小以对缓冲区执行任何 malloc() ?可以在管道文件描述符上使用 fstat() 函数吗?
我知道 read() 函数将读取指定数量的字节,但如果在读取请求的字节之前到达文件末尾(不是 EOF 字符),它将返回 0。
我专门运行带有 2.6.27-9 内核的 Ubuntu GNU/Linux。
Richard Stevens 的“UNIX 环境中的高级编程”中的所有示例都指定了写入管道时的数据长度,或者依赖于 fgets() stdio.h 函数。由于我关心速度,我想尽可能地远离使用 stdio.h。
共享内存一定会更快吗?
谢谢, -Dhruv
【问题讨论】:
-
感谢大家的回复。通过管道发送数据的子进程基本上是一个工具的执行输出,它列出了一些关于系统的统计信息。每次输出的长度都不一样。我已将 STDOUT 复制到子管道的写入端。我的理解是,执行该工具后的子进程会自动将输出放在管道的写入端,因为我已经复制了 STDOUT。一旦我在父级中完成等待,我应该能够使用 read() 从管道中读取数据。如何获取父级中 read() 的长度?
-
我将对收集的输出进行一些解析。由于该工具的输出使用换行符和空格进行了很好的格式化,因此我可以通过使用指针遍历缓冲区而不是将中间数据存储在磁盘上的文件中然后使用 string.h 函数(如 sscanf())来更轻松有效地完成此操作。我想知道在管道上连续执行 lseek() 是否有助于获取数据的大小。
-
请阅读我的答案更新。如果您想在数据可用时读取数据,它将告诉您该怎么做。
-
您不能在管道上使用 lseek()。尽管它有一个文件描述符并且行为有点像文件,但管道不是文件,而不是套接字。