Я должен прочитать сценарий от пользователя и вызвать QProcess
передавая этот сценарий как файл.
Например, пользователь вставляет, скажем, скрипт Python
import sys
print(sys.copyright)
и я должен поместить этот скрипт в файл и вызвать интерпретатор python, используя этот файл.
Я думал использовать QTemporaryFile
потому что этот файл будет служить только при запуске процесса, и мне не нужно держать его открытым.
Вопрос заключается в следующем: безопасно ли открывать QTeoraryFile, записывать в него что-либо, передавать этот файл процессу (который будет продолжаться бесконечно), а затем уничтожать временный файл? Что если процессу снова понадобится этот файл? Что если процесс оставит файл открытым?
Я считаю, что, если процесс остается открытым, никаких проблем не возникнет: возможно, QTeventFile отменит путь, но данные все равно будут доступны в памяти.
Но что, если процесс попытается снова открыть файл?
Вот фрагмент как пример (писал на лету)
QString script = QInputDialog::getText(blah);
QTemporaryFile tmp;
if (tmp.open()) {
tmp.write(script.toUtf8());
QStringList params;
params << tmp.fileName();
QProcess *proc = new QProcess("/usr/bin/python3");
proc->start(params);
}
Насколько я понимаю, в случае флага ‘autoRemove’ (который включен по умолчанию) QTeoraryFile будет существовать до тех пор, пока существует экземпляр QTevenFile. Поэтому в коде, который вы изначально представили, когда tmp выйдет из области видимости, файл будет удален. Вызов open / close для объекта не удалит файл.
Вы можете динамически выделить файл с помощью QTeoraryFile * pTmp = new QTevenFile, а затем удалить его позже, если вы знаете, когда скрипт Python закончил с ним.
Ой, я только что отметил autoRemove
флаг в QTemporaryFile
, Я думаю, что это может быть решением: если установить false
, файл не будет удален с диска, поэтому процесс может свободно использовать файл — я думаю.
Временные файлы должны храниться в расположении системы по умолчанию, поэтому я предполагаю, что файлы не удаляются до перезагрузки (по крайней мере, я считаю, что Linux работает таким образом).
Это всего лишь идея, но я буду ждать других ответов или подтверждений.