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

我有以下实现的function,用于读取没有磁盘使用gzipped文件。

#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); } 

这工作正常。 我试图实现支持编写压缩输出相同的技术,即写入pipe道和输出到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