使用管道编写gzipped输出文件而无需额外的磁盘空间

时间:2016-06-04 06:26:48

标签: c++ linux pipe gzip

我有以下实现的功能来读取没有磁盘使用的gzip压缩文件。

#include <fstream>
#include <stdlib.h> // for mkstemp() and std::system()
#include <memory>
#include <errno.h>
#include <cassert>
#include <unistd.h> // for ::close() and unlink()

void foo (std::ifstream& in, std::string& fileName)
{
    char tmpName[] = "/tmp/tmp.XXXXXX";
    const int fileDescriptor = mkstemp(tmpName);

    if (fileDescriptor >= 0)
    {
        std::string tmpFileName (tmpName);
        ::close(fileDescriptor);
        unlink(tmpFileName.c_str());
        std::string cmd= "mkfifo " + tmpFileName;
        int systemReturnVal = std::system(cmd.c_str());

        cmd = "gunzip -c " + fileName + " > " + tmpFileName + "&";
        systemReturnVal = std::system(cmd.c_str());
        assert(systemReturnVal);

        fileName = tmpFileName;
    }
    in.open(fileName, std::ios::in); 
}

这很好用。我尝试使用相同的技术实现对压缩输出的支持,即写入管道并输出到gzip。

// same includes
void foo (std::ofstream& out, std::string& fileName)  
{
    char tmpName[] = "/tmp/tmp.XXXXXX";
    const int fileDescriptor = mkstemp(tmpName);

    if (fileDescriptor >= 0)
    {
        std::string tmpFileName (tmpName);
        ::close(fileDescriptor);
        unlink(tmpFileName.c_str());
        std::string cmd= "mkfifo " + tmpFileName;
        int systemReturnVal = std::system(cmd.c_str());

        cmd = "gzip -c " + tmpFileName + " > " + fileName + "&";      
        systemReturnVal = std::system(cmd.c_str());
        assert(systemReturnVal);

        fileName = tmpFileName;
    }
    out.open(fileName, std::ios::out); 
}

问题是此行发生的分段错误:out.open(fileName, std::ios::out);

请帮助我了解我做错了什么以及如何正确实施第二个foo()

修改

注意,在segfault之前还会输出以下消息。 gzip: /tmp/tmp.qoc18X: Resource temporarily unavailable

0 个答案:

没有答案