2012-01-11 3 views
6

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

ответ

12

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

#include <unistd.h> 

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

    return 0; 
} 

Из execvp() man page:

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

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

+0

Вместо использования эха я использовал другую программу, которая по существу выводит все в своем массиве argv. Я всегда считал, что argv [0] будет именем самой команды (первый параметр execv), но в этом случае после вызова execv, argv [0] не был. Скорее, это был второй параметр execv. Можете ли вы это прояснить? – Lucas

+0

Ну, когда вы передали список аргументов 'execv', вы задали' argv [0] 'имя команды? Массив, который вы передаете в качестве второго аргумента 'execvp' *, становится *' argv' в новой программе, поэтому вам нужно настроить его так, как он ожидал бы. –

+0

Этот код нарушает корректность const. Я бы предпочел написать const char * args [] = {...}; но прототип для execvp требует, чтобы строки в args были доступны для записи! – user877329

0

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

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

Попробуйте

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

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

+1

Это не работает 'execvp()'. –

+0

Из того, что я понимаю, execvp принимает команду и массив argv. Во время вызова execvp и команда, и массив argv не были NULL. Однако, когда эхо вызывалось, у него не было никаких аргументов. – Lucas

+0

К сожалению, опечатка - означает 'execlp' ... –