Листинг 10.11. Программа execlls.c
#include
#include
#include
int main (void)
{
pid_t result;
result = fork ();
if (result == -1) {
fprintf (stderr, "Fork error\n");
return 1;
}
/* Child */
if (result == 0) {
execl ("/bin/ls", "ls", "-l", "/", NULL);
fprintf (stderr, "Exec error\n");
return 1;
}
/* Parent */
return 0;
}
Из листинга 10.11 видно, что использование execl() в нашем случае значительно упростило программу. Но иногда требуется тот же execl(), но с возможностью передачи окружения в вызываемую программу. Для этого существует функция execle(), работа которой продемонстрирована в следующем примере (листинг 10.12).
Листинг 10.12. Пример execlels.c
#include
#include
#include
extern char ** environ;
int main (void)
{
pid_t result;
result = fork ();
if (result == -1) {
fprintf (stderr, "Fork error\n");
return 1;
}
/* Child */
if (result == 0) {
execle ("/bin/ls", "ls", "-l", "/", NULL, environ);
fprintf (stderr, "Exec error\n");
return 1;
}
/* Parent */
return 0;
}
Функции execve(), execl() и execle() вызывают программу, указывая абсолютный путь к ее исполняемому файлу. Но для нас зачастую более привычен вариант использования переменной окружения PATH для поиска указанного исполняемого файла. Такую возможность предоставляет функция execlp(), что иллюстрирует листинг 10.13.
Листинг 10.13. Пример execlpls.c
Функция execv(), рассмотренная далее (листинг 10.14), работает так же, как и execve(), только без возможности передачи "особенного" окружения.
Листинг 10.14. Пример execvls.c
#include
#include
#include
int main (void)
{
pid_t result;
char * ls_args[] = {
"ls",
"-l",
"/",
NULL
};
result = fork ();
if (result == -1) {
fprintf (stderr, "Fork error\n");
return 1;
}
/* Child */
if (result == 0) {
execv ("/bin/ls", ls_args);
fprintf (stderr, "Exec error\n");
return 1;
}
/* Parent */
return 0;
}
И наконец, функция execvp() делает то же, что и execv(), но с возможностью поиска исполняемого файла программы в переменной окружения PATH. Следующий пример (листинг 10.15) демонстрирует работу execvp().
Достарыңызбен бөлісу: |