Обработка аргументов массива из execvp? - PullRequest
6 голосов
/ 12 января 2012

Когда я вызываю execvp, например execvp(echo, b), где b - массив аргументов для команды a, повлияет ли изменение этого массива позднее на вызов execvp, сделанный ранее?Когда я пытаюсь вызвать execp (echo, b), он заканчивает печатью (null) вместо содержимого внутри b.Кто-нибудь может указать, почему и что я должен сделать, чтобы правильно передать аргументы?

Ответы [ 2 ]

12 голосов
/ 12 января 2012

После того, как вы позвоните exec() или одному из его родственников, ваша исходная программа не будет больше. Это означает, что ничто в этой программе не может повлиять на что-либо после вызова exec(), поскольку он никогда не запускается. Может быть, вы не правильно строите массив аргументов? Вот быстрый рабочий пример execvp():

#include <unistd.h>

int main(void)
{
  char *execArgs[] = { "echo", "Hello, World!", NULL };
  execvp("echo", execArgs);

  return 0;
}

Из execvp() справочной страницы :

Функции execv(), execvp() и execvpe() предоставляют массив указателей на строки с нулевым символом в конце, которые представляют список аргументов доступно для новой программы. Первый аргумент, по соглашению, должен указывать на имя файла, связанное с исполняемым файлом. Массив указателей должен заканчиваться указателем NULL.

Распространенной ошибкой является пропуск части о том, что «первый аргумент, по соглашению, должен указывать на имя файла, связанное с исполняемым файлом». Это та часть, которая гарантирует, что echo получает "эхо" как argv[0], что, по-видимому, зависит от.

0 голосов
/ 12 января 2012

Помните, что после exec вызов вашей программы заменяется новой. Он больше не выполняется, поэтому любой код в том же процессе после вызова exec фактически недоступен.

Вы уверены, что массив b заканчивается NULL? Последний элемент должен быть NULL для правильной работы exec. Кроме того, не забудьте также установить свой первый параметр на «echo» (это argv [0]).

Попробуйте

execlp("echo", "echo", "something", NULL);

Кстати, execlp немного удобнее в использовании, вы можете передать столько параметров, сколько пожелаете.

...