C ++: Какая альтернатива системе (…) является кроссплатформенной и безопасной?

0

Я хотел бы использовать system(...) в C++ для выполнения других исполняемых файлов. После некоторых исследований кажется, что все думают, что system(...) является наихудшей вещью когда-либо, и никто не должен ее использовать, если они абсолютно не нужны, потому что это

  • ресурс тяжелый
  • не гарантируется работа на всех платформах
  • антивирусное программное обеспечение часто считает его злонамеренным
  • могут быть легко использованы/могут непреднамеренно запускать неправильные программы

Итак, есть ли альтернатива system(...) которую я должен использовать? Я нахожусь в Linux, но мне хотелось бы, чтобы это была кросс-платформенная (по крайней мере, между Linux и Windows).

  • 1
    Для кроссплатформенной работы system() является переносимой (это стандарт C, а следовательно, и стандарт C ++). Любая альтернатива зависит от платформы. Комментарий «не гарантируется работа на всех платформах» является странным; не ясно, какой смысл делается. Если вы составляете сложную командную строку с большим количеством метасимволов (перенаправление ввода / вывода, кавычки и т. Д.), То вы ограничиваете шансы работы команды на разных платформах. Но для простых команд с простыми аргументами это будет работать нормально. Что касается запуска неправильных программ, это зависит от того, как вы строите имя команды, но детали зависят от платформы.
  • 0
    @JonathanLeffler, так ты думаешь, будет нормально, если я использую system() ? Это снижает производительность запущенного приложения?
Показать ещё 13 комментариев
Теги:
executable
cross-platform
system

2 ответа

1
Лучший ответ

Если ваша цель - просто синхронно выполнять подпроцесс, system действительно не плохая ставка. Он определен на C89, поэтому он очень портативен, и производительность не обязательно является проблемой, если вам не нужно запускать огромное количество подпроцессов.

Да, вы должны знать о проблемах безопасности: вам нужно очистить переменные среды и всегда выполнять этот процесс, используя полный путь (когда это возможно), чтобы избежать атак PATH. Кроме того, никогда не используйте внешний вход при построении вашей system команды без надлежащего экранирования.

Если вы будете осторожны с ним, это хороший переносимый способ запуска внешних программ.

  • 1
    Это не портативный; между windows и linux, кардинально отличающиеся системы оболочек могут вызывать затруднения в диагностике поведения. Даже между Dash и Bash есть целый список ошибок, с которыми приходится иметь дело. Только используя его чрезвычайно ограниченным образом (и принимая во внимание любые возможные системные различия), он мог быть использован эффективно. Вряд ли портативный.
  • 1
    @Alice: А что бы вы предложили, чтобы он был более портативным и желательно стандартизированным?
Показать ещё 8 комментариев
-3

Нет; любое такое решение обязательно влечет за собой те же риски. system явно ошибочна, потому что она требует string параметра и использует это для доступа к неизвестной (и не обязательно стандартизованной) файловой системе.

Однако, если вам нужно выполнить другой исполняемый файл в переносном режиме, у вас нет другого выбора; в C/C++ нет концепции процесса (подумайте об этом, вполне приемлемо сделать программу, которая работает без файловой системы, других исполняемых файлов и даже других потоков).

Вот несколько вещей, которые вы можете сделать, чтобы сделать его более безопасным:

  1. Используйте API файловой системы из C++ 11 (или fopen, если вы хотите быть действительно переносимым), чтобы проверить, действительно ли предоставленный файл существует; система может выполнять код оболочки, что может быть опасно.
  2. Не добавляйте специфические вещи файловой системы в строку (например, "../"), потому что файловые системы не переносятся. Вы должны быть в порядке, если программа, которую вы хотите выполнить, находится в том же каталоге, что и исполняемый в данный момент.
  3. Используйте Posix (если переносимость окон не может быть гарантирована) и используйте fork/exec. Тогда у вас гораздо больше контроля.

Boost.Process также может использоваться, если "портативный" означает "переносимый на несколько конкретных платформ, а не эзотерические".

  • 0
    Осторожнее с проверками существования. Защитить от атак TOCTTOU кросс-платформенным способом нетривиально.
  • 0
    Кроме того, Windows не поддерживает POSIX. Иногда он поддерживает подмножество POSIX, но соответствие определенно нечеткое. И Cygwin не является идеальным решением для мобильности.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню