Использование имени файла, сгенерированного из 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!
}

1 ответ

Решение

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

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

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

Другие вопросы по тегам