В вашем случае, когда вы фактически проходите
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. Вы должны просмотреть исходный код, чтобы лучше понять внутреннюю работу