【问题标题】:Reading and piping large files with C使用 C 读取和管道传输大文件
【发布时间】:2010-11-13 18:02:36
【问题描述】:

我有兴趣编写一个修改 PostScript 文件的实用程序。它需要遍历文件,对页数和尺寸做出某些决定,然后将输出写入文件或标准输出,对 PostScript 代码进行某些修改。

在这种情况下,在 *NIX 系统上处理文件处理的好方法是什么?我对 C 中的管道和分叉相当陌生,据我了解,如果直接读取文件,我可能会在输入文件周围来回寻找,但如果输入直接通过管道传输到程序中,我不能简单地倒退到输入的开头,因为输入可能是网络流,例如,对吗?

与其将整个 PS 文件存储到内存中(它会变得巨大),不如在我进行第一次页面分析时将输入缓冲到磁盘更有意义,然后从临时文件中重新读取,产生输出,并删除临时文件。如果这是一个可行的解决方案,那么在 *NIX 系统上存储此类文件的好地方是哪里?我也不确定这样的代码有多安全:该程序可能被同一服务器上的多个用户使用。听起来我会确保将文件保存在给定用户帐户唯一的临时目录中的某个位置,并为磁盘上的临时文件指定一个相当唯一的名称。

对于这个疯狂令人费解的文件处理世界的任何提示和指示,我们将不胜感激。

【问题讨论】:

    标签: c file file-io postscript


    【解决方案1】:

    使用mkstemp(3) 创建您的临时文件。它将为您处理并发问题。 mmap(2) 会让你在文件中随意移动。

    【讨论】:

    • 太完美了!虽然我确实觉得我有点避免学习临时文件创建并发性:)
    • mkstempmktemp有什么区别?
    • @Helper:正如mktemp(3) 手册页中所述,mktemp() 有几个安全问题。
    【解决方案2】:

    如果输入直接通过管道传输到程序中,我不能简单地倒退到输入的开头,因为输入可能是网络流,例如,对吗?

    没错。您只能对文件执行随机访问。

    如果您阅读该文件,也许您可​​以构建一个元数据表,以后可以使用它来查找文件的特定部分,而无需将文件本身保存在内存中。

    【讨论】:

      【解决方案3】:

      /tmp 是 unix 系统上的临时目录。它由 FHS 指定。系统重启后就清除了。

      如果您需要更多的持久性数据存储,那么 /var/tmp 在重新启动后不会被清除。还有 FHS。

      http://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard

      【讨论】:

        猜你喜欢
        • 2011-07-23
        • 1970-01-01
        • 2020-08-14
        • 1970-01-01
        • 1970-01-01
        • 2014-12-15
        • 1970-01-01
        • 2015-01-08
        • 1970-01-01
        相关资源
        最近更新 更多