[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Системный вызов fork(2) - Пример
Эта программа создает два процесса: родитель распечатывает заглавные
буквы, а порожденный - строчные.
13-16 Значение, возвращенное fork(2), присваивается переменной
pid. Положительное значение pid означает родительский
процесс.
17-20 Нулевое значение pid означает порожденный процесс.
21-24 Если значение, возвращаемое fork(2), равно -1, то произошла
ошибка. В этом случае вызывается функция perror(3), которая
распечатывает сообщение о причине неуспеха. Затем программа
завершается.
21-24 Как родительский, так и порожденный процессы распечатывают
буквы этим оператором for. Внутренний цикл здесь просто
потребляет время процессора, чтобы бы происходило
переключение процессов. Это приводит к тому, что большие и
маленькие буквы на выводе перемешиваются. Иначе оба процесса
быстро бы завершались в течении одного кванта времени.
Оба процесса имеют одинаковую возможность получить управление. Поэтому
любой из них может начать исполнение первым.
Файл: fork1.c
СИСТЕМНЫЙ ВЫЗОВ fork(2) - ПРИМЕР
1 #include <sys/types.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <stdio.h>
5 static const int Bignumber = 10000;
6
7 main(int argc, char *argv[ ]) /* demonstrate fork(2) */
8 {
9 char ch, first, last;
10 pid_t pid;
11 int i;
12
13 if ((pid = fork()) > 0) { /* parent */
14 first = 'A';
15 last = 'Z';
16 }
17 else if (pid == 0) { /* child */
18 first = 'a';
19 last = 'z';
20 }
21 else { /* cannot fork(2) */
22 perror(argv[0]);
23 exit(1);
24 }
25 for (ch = first; ch <= last; ch++) {
26 /* delay loop */
27 for (i = 0; i < Bignumber; i++)
28 ; /* null */
29 write(1, &ch, 1);
30 }
31
32 exit(0);
33 }