通常的解决方案类似于 MichaelH 提出的方案:写入过程以附加模式打开文件,并始终写入到末尾。阅读过程符合 MichaelH 的建议。
这适用于每次运行中的少量数据。如果进程应该运行很长时间,并生成大量数据,文件最终会变得太大,因为它也包含所有处理过的数据。在这种情况下,解决方案是使用一个目录,在其中生成编号文件,每个数据记录一个文件。写入过程将每个数据集写入一个新文件(递增数字),读取过程将尝试打开新文件,并在完成后将其删除。这比第一个建议复杂得多,但即使对于每秒生成大量数据并运行多年的进程也有效。
编辑:
OP 后来的评论说该设备实际上是一个 FIFO。在这种情况下:
你不能寻求,所以 MichaelH 的建议不能按字面意思使用,但是
您无需查找,因为数据在被读取时会自动从 FIFO 中删除,并且
根据数据的大小和写入方式,写入可能是原子的,因此您不必担心部分记录,即使您恰好在写入中间读取。
关于后者:确保读取和写入缓冲区都足够大以包含完整的记录,并且写入器在每条记录后刷新。并确保记录小于保证原子性所需的大小。(从历史上看,在我知道的早期 Unix 上,这是 4096,但如果从那以后它没有增加,我会感到惊讶。虽然......在 Posix 下,这是由 定义的PIPE_BUF
,只能保证至少为 512,在现代 Linux 下只有 4096。)