logo search
Операционные системы

Пример использования системного вызова execl().

Приведем ряд примеров для иллюстрации применения различных вызовов семейства exec().

Пример. Если обращение к системному вызову будет неуспешным, то функция printf() отобразит на экране соответствующий текст.

#include <unistd.h>

int main(int argc, char **argv)

{

...

/*тело программы*/

...

execl(“/bin/ls”, ”ls”, ”-l”, (char*)0);

/* или execlp(“ls”, ”ls”, ”-l”, (char*)0); */

printf(“это напечатается в случае неудачного обращения к предыдущей функции, к примеру, если не был найден файл ls \n”);

...

}

Пример. Вызов C-компилятора. В данном случае второй параметр — вектор из указателей на параметры строки, которые будут переданы в вызываемую программу. Как и ранее, первый указатель — имя программы, последний — нулевой указатель. Эти вызовы удобны, когда заранее неизвестно число аргументов вызываемой программы.

int main(int argc, char **argv)

{

char *pv[]={“cc”, “-o”, “ter”, “ter.c”, (char*)0};

...

/*тело программы*/

...

execv (“/bin/cc”, pv);

...

}

Итак, мы рассмотрели по отдельности системные вызовы fork() и exec(), но в ОС Unix обычно применяется связка вызовов fork-exec.

Для иллюстрации сказанного рассмотрим еще один пример. В данном случае родительский процесс (PID = 2757) порождает своего потомка посредством обращения к системному вызову fork(), после чего в отцовском процессе управление переходит на else-блок. В то же время в дочернем процессе (PID = 2760) управление передается на первую инструкцию then-блока, где происходит обращение к системному вызову execl(). После чего тело дочернего процесса меняется на тело команды ls.