Тот факт, что для errno
установлено значение ENOENT
(такого файла или каталога нет), говорит о том, что execlp()
не удалось найти исполняемый файл.
Из страницы руководства :
Функции execlp()
, execvp()
и execvpe()
дублируют действия оболочки при поиске исполняемого файла, если указанное имя файла не содержит sla sh (/
) символ. Файл ищется в списке разделенных двоеточиями каталогов, указанных в переменной среды PATH
. Если эта переменная не определена, по умолчанию в списке путей указан текущий каталог, за которым следует список каталогов, возвращаемый confstr(_CS_PATH)
. (Этот вызов confstr(3)
обычно возвращает значение "/bin:/usr/bin"
.)
Ваш текущий рабочий каталог, скорее всего, не в вашем PATH
, и поэтому исполняемый файл не является нашел. Простое решение - просто добавить ./
перед его именем:
execlp("./prog2b", "prog2b", "grep", "-R", "key","head->path", NULL);
// here ^^
Совет на будущее: вы можете точно увидеть, где exec*()
пытается посмотреть, используя strace
:
$ strace -f -e execve ./prog2b 5678 /hw1/02/
execve("./prog2b ", ["./prog2b", "5678", "/hw1/02/"], [/* 40 vars */]) = 0
key: 5678
Child process 70788. Running grep on 5678 /hw1/02
execve("/usr/local/bin/prog2b", ["prog2b", "grep", "-R", "key","head->path"], [/* 40 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/bin/prog2b", ["prog2b", "grep", "-R", "key","head->path"], [/* 40 vars */]) = -1 ENOENT (No such file or directory)
execve("/bin/prog2b", ["prog2b", "grep", "-R", "key","head->path"], [/* 40 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/local/games/prog2b", ["prog2b", "grep", "-R", "key","head->path"], [/* 40 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/games/prog2b", ["prog2b", "grep", "-R", "key","head->path"], [/* 40 vars */]) = -1 ENOENT (No such file or directory)
Exec failed.. Why?
+++ exited with 1 +++