Использование имени файла, сгенерированного из mkstemp - PullRequest
3 голосов
/ 07 марта 2012

Функция 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!
}

1 Ответ

4 голосов
/ 07 марта 2012

С справочной страницы для mkstemp:

Файл открывается с флагом open (2) O_EXCL , гарантирующим, что вызывающая сторона - это процесс, который создает файл.

Флаг O_EXCL не позволяет снова открыть файл. Это нормально, так как это временный файл - доступ к нему должен иметь только один процесс (создатель). Временные файлы иногда содержат конфиденциальные данные.

...