我正在寻找C编程中从stdin
管道读取数据的最佳方法。
问题:我需要查找这些数据(在这个流的末尾读取一些数据后,我需要从流的开头读取数据)。
小用例:gunzip -c 4GbDataFile.gz | myprogram
另一个:
nc -l -p 1234 | myprogram
gunzip -c 4GbDataFile.gz | nc -q 0 theotherhost 1234
我知道从fifo中读取只能完成一次。因此,目前:
stdin
到内存,然后从这个分配的内存开始工作。很丑,但很管用。一个明显的问题是,如果有人向我的应用程序发送一个巨大的(或连续的)流,我将以一个大的分配内存块结束,否则我将耗尽内存。(想想一个8Gb的文件)
我接下来想的是:
但那又有什么意义呢?我无法找到我正在阅读的数据的来源。如果这是一个本地的8Gb文件,我将把它转储到同一个系统上的另一个8Gb文件中。
所以,我的问题是:
当您必须在管道中来回查找时,如何有效地读取
stdin
管道中的大量stdin
数据?
提前谢谢你的回答。
编辑:
我的程序需要在给定文件中的某个地方(取决于文件格式)读取元数据,以便可能在流的末尾读取元数据。然后,它可以在流开始时读取其他数据,然后在另一个地方读取等等。简而言之:它需要访问数据的任何字节。
例如,在开始从stdin
读取之前,在不知道文件格式的情况下读取归档文件的数据:我需要检查归档元数据,查找归档文件的名称和偏移等。
,所以我将在本地复制stdin内容并从中工作。谢谢大家的投入;)
发布于 2012-05-07 03:35:15
4GbDataFile中的数据结构并不适合您想要做的事情。跳出框框思考。不要把你的程序敲成它根本不应该尝试的东西。尝试修复生成输入格式的位置,这样您就不需要返回4GB。
如果您喜欢锤击: 4GB的核心内存是相当昂贵的。相反,将从stdin读取的数据保存在一个文件中,然后打开该文件(或mmap ),然后查找到您心中的内容。
发布于 2012-05-07 03:27:12
你需要弄清楚你的要求。如果您需要 from (),那么显然不能从stdin获取输入。如果您需要 file (),那么应该以输入文件名作为参数。
发布于 2012-05-07 04:11:44
我想你应该看看声名狼藉的无用使用猫奖。
TL;DR:将cat 4gbfile | yourprogram
改为yourprogram < 4gbfile
。
如果您确实坚持让它处理管道中的数据,那么您必须在启动时将其存储在一个临时文件中,然后使用dup2
将文件描述符0替换为临时文件的fd副本。
https://stackoverflow.com/questions/10481093
复制