Выполнение команды из C++. Что ожидается в argv[0]?
-
23-09-2019 - |
Вопрос
Я использую execv()
для запуска команд из /bin/, таких как «ls», «pwd», «echo» из моей программы на C++, и мне интересно, какое значение мне следует указать в argv[0];
const char * path = getPath();
char ** argv = getArgs();
execv(path,argv);
Решение
argv[0]
должно быть именем программы.Он передан в программу main
функция.Некоторые программы различают свое поведение в зависимости от того, какая строка argv[0]
является.Например, ГНУ bash
оболочка отключит некоторые из своих функций, если вызвать ее с помощью sh
вместо bash
.Лучше всего присвоить ему то же значение, которое вы передаете. path
.
В Linux, argv[0]
— это имя процесса, отображаемое top
утилита (которую она, вероятно, получает при чтении записей в /proc/
)
Другие советы
argv[0] должен быть полным путем к команде, которую вы хотите запустить.
Я знаю, что это не тот ответ, который вы ищете, но есть ли конкретная причина, по которой вы это делаете?Причина, по которой я спрашиваю, заключается в том, что большинство, если не все действия, которые люди обычно совершают либо system()
или execv()
доступны в библиотеках Windows или Unix и безопаснее, быстрее и с меньшей вероятностью страдают от косвенный ошибки.Я имею в виду, например, когда PATH
меняется, и внезапно ваш код перестает работать.
Если вы передаете строку полностью или частично и запускаете ее, вы также оставляете себя открытым для пользователя, получающего доступ к системе путем ввода команды, которая может нанести вред.Например.представьте, что вы реализовали поиск файлов, используя find /home -name
и ваш пользователь вводит:
"%" -exec rm {} \;
Ой!