Выполняя команду из C ++, что ожидается в argv [0]? - PullRequest
3 голосов
/ 02 марта 2010

Я использую execv() для запуска команд из / bin /, таких как 'ls', 'pwd', 'echo' из моей программы на c ++, и мне интересно, какое значение я должен предоставить в argv [0];

const char * path = getPath();
char ** argv = getArgs();

execv(path,argv);

Ответы [ 3 ]

12 голосов
/ 02 марта 2010

argv[0] должно быть именем программы. Он передается в функцию программы main. Некоторые программы различают свое поведение в зависимости от того, какая строка argv[0]. Например, оболочка GNU bash отключит некоторые из ее функций, если вызывается с использованием sh вместо bash. Лучше всего дать ему то же значение, которое вы передаете path.

В linux argv[0] - это имя процесса, отображаемое утилитой top (которое, вероятно, получает при чтении записей в /proc/)

5 голосов
/ 02 марта 2010

argv [0] должен быть полным путем к команде, которую вы хотите выполнить.

2 голосов
/ 02 марта 2010

Я знаю, что это не тот ответ, который вы ищете, но есть ли конкретная причина, почему вы делаете это? Причина, по которой я спрашиваю, состоит в том, что большинство, если не все действия, которые обычно выполняются с system() или execv(), доступны в библиотеках Windows или Unix и безопаснее, быстрее и с меньшей вероятностью страдают от косвенных ошибки. Под этим я подразумеваю, например, когда PATH меняется и вдруг ваш код перестает работать.

Если вы передаете строку, полностью или частично, и запускаете ее, вы также оставляете себя открытым для пользователя, который получает доступ к системе, вводя команду, которая может быть вредной. Например. представьте, что вы реализовали поиск файлов, используя find /home -name, и ваши пользователи вводят:

"%" -exec rm {} \;

Ой!

...