Использование схемы fork-exec

Пример. Вызов программы компиляции

Пример

#include <unistd.h>

#include <stdio.h>

int main(int argc, char **argv)

{ …

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

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

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

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

}

#include <unistd.h>

int main(int argc, char **argv)

{

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

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

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

}

#include <sys/types.h>

#include <unistd.h>

int main(int argc, char **argv)

{

int pid;

if ((pid=fork())!=0){

if(pid>0)

{/* процесс-предок */}

else

{/* ошибка */}

}

else

{/* процесс-потомок */}

}

Программа порождает три процесса, каждый из которых запускает программу echo посредством системного вызова exec(). Данный пример демонстрирует важность проверки успешного завершения системного вызова exec(), в противном случае возможно исполнение нескольких копий исходной программы. В нашем случае если все вызовы exec() проработают неуспешно, то копий программ будет восемь. Если все вызовы exec() будут успешными, то после последнего вызова fork() будет существовать четыре копии процесса. В каком порядке они пойдут на выполнение предсказать трудно.

#include <sys/types.h>

#include <unistd.h>

#include <stdio.h>

int main(int argc, char **argv)

{

if(fork()==0)

{

execl(“/bin/echo”, ”echo”, ”это”, ”сообщение один”, NULL);

printf(“ошибка\n”);

}

if(fork()==0)

{

execl(“/bin/echo”, ”echo”, ”это”, ”сообщение два”, NULL);

printf(“ошибка\n”);

}

if(fork()==0)

{

execl(“/bin/echo”, ”echo”, ”это”, ”сообщение три”, NULL);

printf(“ошибка\n ”);

}

printf(“процесс-предок закончился\n”);

return 0;

}

Результат работы может быть следующим.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: