Использование имени файла, сгенерированного из 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 не позволяет вам снова открыть файл. Это нормально, так как это временный файл - только один процесс (создатель) должен иметь к нему доступ. Временные файлы иногда содержат конфиденциальные данные.