c++ 使用从mkstemp生成的文件名

z5btuh9x  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(103)

mkstemp()函数从template中生成一个唯一的临时文件名,创建并打开文件,并返回文件的打开文件描述符。template的最后六个字符必须是“XXXI”,这些字符将被替换为使文件名唯一的字符串。由于它将被修改,template不能是字符串常量,但应声明为字符数组。
在模板被替换为一个字符串,使文件名唯一后,我保存字符串供以后使用。这是我遇到一个奇怪的问题,我似乎不能 Package 我的头周围。我可以打印正确的文件名到我的终端,看到我的文件浏览器中的文件,并打开它看到正确的内容,但是当我把这个字符串作为一个命令的一部分,用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!
}

字符串

bqf10yzr

bqf10yzr1#

mkstemp的手册页:
文件是用open(2)O_EXCL标志打开的,保证调用者是创建文件的进程。

O_EXCL标志阻止您再次打开该文件。这是可以的,因为它是一个临时文件-只有一个进程(创建者)应该可以访问它。临时文件有时包含敏感数据。

qv7cva1a

qv7cva1a2#

“O_EXCL标志防止您再次打开文件”。这是一个奇怪的措辞。正确的是:O_EXCL只有在与O_CREAT组合时才有意义,否则其行为是未定义的。其次,使用O_EXCL打开|O_CREAT阻止当前进程创建已经存在的文件[1]。没有任何东西阻止当前进程或其他进程第二次打开当时存在的文件。
[1][https://pubs.opengroup.org/onlinepubs/9699919799.2013edition/functions/open.html](https://pubs.opengroup.org/onlinepubs/9699919799.2013edition/functions/open.html)

相关问题