Аргументы execvp

Хелло все,

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

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 ответа

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


Когда вы выполняете 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).

licensed under cc by-sa 3.0 with attribution.