Создать исполняемый файл, который вызывает другой исполняемый файл?

Я хочу создать небольшое приложение, которое несколько раз запускает другое приложение для разных входных параметров.

  1. Это уже сделано?
  2. Неправильно ли использовать system("myAp param") для каждого вызова (конечно, с другим значением param)?

Я использую kdevelop на Linux-Ubuntu.

Из ваших комментариев я понимаю, что вместо:

system("path/to/just_testing p1 p2");

Я буду использовать:

execl("path/to/just_testing", "path/to/just_testing", "p1", "p2", (char *) 0);

Это правда? Вы хотите сказать, что execl безопаснее, чем system, и его лучше использовать?


person thedarkside ofthemoon    schedule 15.05.2014    source источник
comment
Для этого предназначен xargs.   -  person Sneftel    schedule 15.05.2014
comment
Традиционный способ сделать это был чем-то вроде fork и exec, но system работает так же хорошо.   -  person Rook    schedule 15.05.2014
comment
Если myAp или param исходят от потенциально злонамеренного пользователя, может возникнуть проблема.   -  person Wodin    schedule 15.05.2014
comment
@Sneftel Можете ли вы опубликовать ссылку на пример с использованием xargs? Звучит красиво   -  person thedarkside ofthemoon    schedule 15.05.2014


Ответы (2)


В непрофессиональной сфере использование system() вполне приемлемо, но имейте в виду, что люди всегда скажут вам, что это «неправильно». Это не неправильно, это способ решить вашу проблему, не усложняя ее. Это немного небрежно, да, но, безусловно, это все еще полезный (хотя и немного менее портативный) вариант. Данные, возвращаемые вызовом system(), будут возвращаемым значением приложения, которое вы вызываете. Основываясь на ограниченной информации в вашем посте, я предполагаю, что это все, что вы действительно хотите знать.

person Kats    schedule 15.05.2014
comment
В большой идее, да. Но как использовать другие методы для этого? - person thedarkside ofthemoon; 15.05.2014
comment
людям нравится безопасное программное обеспечение, system() — это огромная дыра в безопасности, ожидающая своего использования - person paulm; 15.05.2014
comment
Я должен согласиться с Rook выше: fork и exec — наиболее типичные способы запуска другой программы и доступа к ее данным. Однако мои познания в Unix несколько устарели, поэтому мне было бы неудобно давать подробные объяснения по каждому из них. - person Kats; 15.05.2014

РАЗЛИЧИЯ МЕЖДУ SYSTEM И EXEC

  • system() вызовет командную оболочку по умолчанию, которая выполнит команду, переданную в качестве аргумента.

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

    Значение, которое вы возвращаете, связано не с успехом самой команды, а с правильным открытием командной оболочки.

    Плюсом system() является то, что это часть стандартной библиотеки.

  • С помощью exec() ваш процесс (вызывающий процесс) заменяется. Более того, вы не можете вызвать сценарий или внутреннюю команду. Вы можете следовать широко используемому методу: Различия между fork и exec

Таким образом, они совершенно разные (для получения дополнительной информации вы можете увидеть: Разница между system и exec в Linux?).

Правильное сравнение между POSIX spawn() и system(). spawn() сложнее, но позволяет прочитать код возврата внешней команды.

БЕЗОПАСНОСТЬ

system() (или popen()) может представлять угрозу безопасности, поскольку некоторые переменные окружения (такие как $IFS / $PATH) могут быть изменены таким образом, чтобы ваша программа выполняла внешние программы, для которых вы никогда не предназначались (т. е. команда указана без имени пути, а механизм разрешения пути командного процессора доступен злоумышленнику).

Также функция system() может привести к использованию уязвимостей:

  • при передаче непроверенной или неправильно продезинфицированной командной строки, исходящей из испорченного источника;
  • если указан относительный путь к исполняемому файлу и злоумышленнику доступен контроль над текущей рабочей директорией;
  • если указанная исполняемая программа может быть подделана злоумышленником.

Для получения дополнительной информации: ENV33-C. Не вызывать system()

В любом случае... Мне нравится ответ Сомбердона.

person manlio    schedule 15.05.2014