Примеры программ

Пример 1. Порождение процессов. Программа в результате выполнения породит три процесса (процесс-предок 1 и процессы-потомки 2 и 3).

#include <sys/types.h>

#include <fcntl.h>

#include <stdio.h>

void main(void)

{ int pid2, pid3, st; /* process 1 */

printf("Process 1, pid = %d:\n", getpid());

pid2 = fork();

if (pid2 == 0) /* process 2 */

{ printf("Process 2, pid = %d:\n", getpid());

pid3 = fork();

if (pid3 == 0) /* process 3 */

{ printf("Process 3, pid = %d:\n", getpid());

sleep(2);

printf("Process 3: end\n");

} /* process 2 */

if (pid3 < 0) printf("Cann't create process 3: error %d\n", pid3);

wait(&st);

printf("Process 2: end\n");

}

else /* process 1 */

{ if (pid2 < 0) printf("Cann't create process 2: error %d\n", pid2);

wait(&st);

printf("Process 1: end\n");

}

exit(0);

}

В соответствии с программой первоначально будет создан процесс 1 (как потомок интерпретатора shell), он сообщит о начале своей работы и породит процесс 2. После этого работа процесса 1 приостановится и начнет выполняться процесс 2 как более приоритетный. Он также сообщит о начале своей работы и породит процесс 3. Далее начнет выполняться процесс 3, он сообщит о начале работы и "заснет". После этого возобновит свое выполнение либо процесс 1, либо процесс 2 в зависимости от величин приоритетов и от того, насколько процессор загружен другими процессами. Так как ни один из процессов не выполняет никакой работы, они, вероятнее всего, успеют завершится до возобновления процесса 3, который в этом случае завершится последним.

Пример 2. Порождение процессов и их синхронизация. Данная программа в результате выполнения породит два процесса причем процесс-предок закончится после процесса-потомка.

#include <sys/types.h>

#include <fcntl.h>

#include <stdio.h>

void main(void)

{ int pid2, pid3, st; /* proc 1 */

printf("Process 1, pid = %d: begin\n", getpid());

pid2 = fork();

if (pid2 < 0) printf("Cann't create process 2: error %d\n", pid2);

else

{ if (pid2 == 0) /* process 2 */

{ printf("Process 2, pid = %d: begin\n", getpid());

sleep(1);

printf("Process 2: end\n");

}

else /* process 1 */

{ wait(&st);

printf("Process 1: end\n");

}

}

exit(0);

}

От предыдущей данная программа отличается наличием синхронизации выполнения процессов: процесс-предок ожидает завершения процесса-потомка (функция wait). Сначала выполняется процесс 1, который порождает процесс 2. После начинает выполняться процесс 2, который после выдачи сообщения "заснет". Тогда возобновит выполнение процесс 1, который приостановится до получения сигнала об окончании процесса 2. По истечение указанного периода процесс 2 возобновит свое выполнение, выдаст сообщение и завершится. После этого будет возобновлен процесс 1, который также выдаст сообщение и завершится.

Пример 3. Синхронизация работы процессов.

Программа породит три процесса (процесс- предок 0 и процессы- потомки 1 и 2). Процессы 1 и 2 будут обмениваться сигналами и выдавать соответствующие сообщения на экран, а процесс 0 через определенное количество секунд отправит процессам 1 и 2 сигнал завершения и сам прекратит свое функционирование.

#include <sys/types.h>

#include <fcntl.h>

#include <stdio.h>

#include <signal.h>

#include <unistd.h>

#define TIMEOUT 10

int f1(int), f2(int), f3(int);

int pid0, pid1, pid2;

void main(void)

{ setpgrp();

pid0 = getpid();

pid1 = fork();

if (pid1 == 0) /* process 1 */

{ signal(SIGUSR1, f1);

pid1 = getpid();

pid2 = fork();

if (pid2 < 0) puts("Fork error");

if (pid2 > 0) for(;;);

else /* process 2 */

{ signal(SIGUSR2, f2);

pid2 = getpid();

kill(pid1,SIGUSR1);

for (;;);

}

}

else /* process 0 */

{ signal(SIGALRM, f3);

alarm(TIMEOUT);

pause();

}

exit(0);

}

int f1(int signum)

{ signal(SIGUSR1, f1);

printf("Process 1 (%d) has got a signal from process 2 (%d)\n",pid1,pid2);

sleep(1);

kill(pid2, SIGUSR2);

return 0;

}

int f2(int signum)

{ signal(SIGUSR2, f2);

printf("Process 2 (%d) has got a signal from process 1 (%d)\n",pid2,pid1);

sleep(1);

kill(pid1, SIGUSR1);

return 0;

}

int f3(int signum)

{ printf("End of job - %d\n", pid0);

kill(0, SIGKILL);

return 0;

}


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



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