функция execvp работает без пути - PullRequest
0 голосов
/ 12 октября 2011

Я пишу работающий скрипт на языке программирования Си.Я читал о функции exec, хотя многого не понимал, но я читал пример, в котором execvp используется следующим образом:

execvp (* argv, argv);

/ *здесь argv - массив указателей на символы, содержащий такие команды, как ls -l

argv [0] -> ls argv [1] -> -l

* /

но он используется без указания имени файла в качестве аргумента. Тогда я не понимаю, как это работает.Любой может объяснить это, так как в описании execvp ему дается указанное имя файла, большое спасибо

1 Ответ

1 голос
/ 12 октября 2011

В вашем случае, когда вы фактически проходите Arg1: ls Arg2: ls -l Убедившись, что ваши аргументы не равны NULL, эта проверка выполняется

/* If it's an absolute or relative path name, it's easy. */
if (strchr(argv[0], '/')){
    execve(argv[0],argv,environ);
}
//In your case this would fail because argv[0] is not an absolute path.
//So now the search for argv[0] begins in the PATH
path = getenv("PATH")
//Now for each directory specified in path, it will attempt an execve call as
//For simplicity, I am calling each directoryname in PATH to be dir
execve(strcat(dir,argv[0]),argv,environ)
//If this generates an error called [ENOEXEC][1], then it's okay to continue searching in other directories, else quit searching and return the errorcode

Я представил упрощенное и абстрактное представление о работе execvp. Вы должны просмотреть исходный код, чтобы лучше понять внутреннюю работу

...