Проблемы с использованием execv и shell exec

0

Я пытаюсь запустить процесс из C++ с помощью системного вызова execv. Он отлично работает, пока я не попытался создать исходную среду пользователя перед запуском моего процесса, вызвав неинтерактивную оболочку.

В основном я изменяю то, что моя команда (для этого примера я использовал файл test.bin, который выгружает массив argv []), теперь имеет префикс: /bin/sh -l -c "exec./testbin testargv1 testargv2 "

Когда я запускаю команду из другой оболочки, я получаю следующее:

0:./testbin 1:./testargv1 2:./testargv2

в то время как, когда я запускаю его через execve в программах C++, я получаю:

0: /bin/sh 1: -l 2: -c 3: exec./testbin testargv1 testargv2

изнутри c, я просто делаю следующее:

char* exe = "/bin/sh";
char** params = { "/bin/sh","-l","-c","exec ./testbin testargv1 testargv2",0 };

execv(exe,params);

Как и при запуске с execve, оболочка не перенастраивает argv перед тем, как развернуть его.

Есть ли у кого-нибудь намеки?

Теги:
macos

1 ответ

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

Вы уверены, что показываете нам правильный код? Мне кажется, что вы делаете что-то вроде этого:

char* exe = "./testbin";
char** params = { "/bin/sh","-l","-c","exec ./testbin testargv1 testargv2",0 };
execv(exe,params);

Как правило, вы должны удалить переменную exe и вызвать execv следующим образом:

execv(params[0], params);
  • 0
    не совсем это, но проблема действительно была в моем не псевдокоде, который передавал неправильное имя исполняемого файла

Ещё вопросы

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