我有以下实现的功能来读取没有磁盘使用的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