使用从mkstemp生成的文件名
Using the filename generated from mkstemp
mkstemp()
函数从模板生成一个唯一的临时文件名,创建并打开文件,并返回文件的打开文件描述符。模板的最后六个字符必须是"XXXXXX",这些字符将替换为使文件名唯一的字符串。由于模板将被修改,所以它不能是字符串常量,而应该声明为字符数组。
将模板替换为使文件名唯一的字符串后,我会保存该字符串以供以后使用。这就是我遇到一个奇怪问题的地方,我似乎无法理解。我可以将正确的文件名打印到我的终端,在文件资源管理器中查看文件并打开它以查看正确的内容,但当我将字符串作为用popen()
执行的命令的一部分时,我会得到一个指向空文件的指针。然而,当我将临时文件的名称硬编码回代码中并再次运行时,我得到了预期的正确结果。有什么东西我忽略了或错过了吗?下面是一个代码片段:
char tmpname[] = "tmp.XXXXXX";
FILE *fpt = fdopen(mkstemp(tmpname), "w");
string saved_tmpname(tmpname);
// blah
// write to file
// blah blah
const string command = "mycommand " + saved_tmpname;
cout << command << endl; // prints correctly
FILE *fpipe = popen(command.c_str(), "r");
if (fpipe == NULL) {
perror(command.c_str());
}
char buff[4096];
while (fgets(buff, 4096, fpipe)) {
// we don't get here!
}
来自mkstemp
:的手册页
使用open(2)O_EXCL标志打开文件,确保调用方是创建文件的进程。
O_EXCL标志阻止您再次打开文件。这是可以的,因为它是一个临时文件-只有一个进程(创建者)可以访问它。临时文件有时包含敏感数据。
相关文章:
- 从命令行c++发送文本文件名
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 当Microsoft文档仅包含 C# 示例时,如何查找 C++ 包含文件名
- 如何在CPP的给定目录中列出UTF编码的文件名?
- 在Visual Studio 2019中保存时ReadDirectoryChangesW文件名的问题
- C++:在Windows中浏览名称中带有点的文件名
- 我在 ifstream input_file(文件名)行中收到错误"no matching function to call";
- 不带预处理器的调用方法/文件的文件名/行号
- 在 C++ 中为文件名添加时间戳
- 为什么当我在 std::string 中打开文件名的 fstream 时出现"no matching function"错误?
- 如何将文件名作为参数传入并正确打开?
- 如何在目录及其子文件夹中构建文件名字符串向量?
- 要求用户输入C++输出文件名
- 从Arduino SD卡模块到Array的文件名
- 用于 Windows 写入临时文件的 mkstemp() 实现
- 如何使用打印到 PDF 打印机在 MFC 和 CView 中以编程方式打印而不提示输入文件名?
- C++ 从变量导入文件名
- 从 Makefile 中的 $@ 获取文件名
- 使用从mkstemp生成的文件名