аргументы execvp - PullRequest
       13

аргументы execvp

4 голосов
/ 08 июня 2011

Привет всем,

У меня есть этот пример кода:

pid = fork();
if (pid == 0) {
   execvp(argv[2],&argv[2]);
   perror("Error");
}else {
wait(NULL);

}  

С man exec Я понимаю, что

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

Итак, если я выполню свою программу следующим образом:

./a.out 5 ls

Команда ls будет выполнена.

А как насчет второго аргумента?в руководстве написано

«Массив указателей должен заканчиваться указателем NULL»

, и я не вижу здесь указателя NULL и не понимаю, что такоефункция &argv[2] здесь.

Большое спасибо!

Ответы [ 2 ]

7 голосов
/ 08 июня 2011

Второй аргумент execvp - это массив char* s, который станет результирующим процессом argv.Чтобы execvp знал, какова длина этого массива, за последним «реальным» элементом должен следовать NULL, например, чтобы передать {"foo", "bar"} как новый argv, второй аргумент - execvp должен ссылаться на массив {"foo", "bar", NULL}.В вашем случае, поскольку массив argv, переданный в main вашей программы, уже завершен собственной записью NULL, вы можете передать &argv[2] в execvp напрямую, не добавляя NULLсами.

2 голосов
/ 08 июня 2011

Когда вы выполняете a.out, он, скорее всего, имеет main, например:

int main(int argc, char *argv[])

/* argv contains this. */
argv[0] == "a.out"
argv[1] == "5"
argv[2] == "ls"
argv[3] == NULL /* Here is your terminator. */

Так что, когда вы передаете argv[2] в execvp, все на месте, но массивначинается с 2 (начинается с ls).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...