Я хотел бы использовать system(...)
в C++ для выполнения других исполняемых файлов. После некоторых исследований кажется, что все думают, что system(...)
является наихудшей вещью когда-либо, и никто не должен ее использовать, если они абсолютно не нужны, потому что это
Итак, есть ли альтернатива system(...)
которую я должен использовать? Я нахожусь в Linux, но мне хотелось бы, чтобы это была кросс-платформенная (по крайней мере, между Linux и Windows).
Если ваша цель - просто синхронно выполнять подпроцесс, system
действительно не плохая ставка. Он определен на C89, поэтому он очень портативен, и производительность не обязательно является проблемой, если вам не нужно запускать огромное количество подпроцессов.
Да, вы должны знать о проблемах безопасности: вам нужно очистить переменные среды и всегда выполнять этот процесс, используя полный путь (когда это возможно), чтобы избежать атак PATH. Кроме того, никогда не используйте внешний вход при построении вашей system
команды без надлежащего экранирования.
Если вы будете осторожны с ним, это хороший переносимый способ запуска внешних программ.
Нет; любое такое решение обязательно влечет за собой те же риски. system
явно ошибочна, потому что она требует string
параметра и использует это для доступа к неизвестной (и не обязательно стандартизованной) файловой системе.
Однако, если вам нужно выполнить другой исполняемый файл в переносном режиме, у вас нет другого выбора; в C/C++ нет концепции процесса (подумайте об этом, вполне приемлемо сделать программу, которая работает без файловой системы, других исполняемых файлов и даже других потоков).
Вот несколько вещей, которые вы можете сделать, чтобы сделать его более безопасным:
Boost.Process также может использоваться, если "портативный" означает "переносимый на несколько конкретных платформ, а не эзотерические".
system()
является переносимой (это стандарт C, а следовательно, и стандарт C ++). Любая альтернатива зависит от платформы. Комментарий «не гарантируется работа на всех платформах» является странным; не ясно, какой смысл делается. Если вы составляете сложную командную строку с большим количеством метасимволов (перенаправление ввода / вывода, кавычки и т. Д.), То вы ограничиваете шансы работы команды на разных платформах. Но для простых команд с простыми аргументами это будет работать нормально. Что касается запуска неправильных программ, это зависит от того, как вы строите имя команды, но детали зависят от платформы.system()
? Это снижает производительность запущенного приложения?