Листинг 12.1. Увеличение глобального счетчика родительским и дочерним процессами
//shm/incr1.c
1 #include "unpipc.h"
2 #define SEM_NAME "mysem"
3 int count = 0;
4 int
5 main(int argc, char **argv)
6 {
7 int i, nloop;
8 sem_t *mutex;
9 if (argc != 2)
10 err_quit("usage: incr1 <#loops>");
11 nloop = atoi(argv[1]);
12 /* создание, инициализация и удаление семафора */
13 mutex = Sem_open(Px_ipc_name(SEM_NAME), O_CREAT | O_EXCL, FILE_MODE, 1);
14 Sem_unlink(Px_ipc_name(SEM_NAME));
15 setbuf(stdout, NULL); /* stdout не буферизуется */
16 if (Fork() == 0) { /* дочерний процесс */
17 for (i = 0; i < nloop; i++) {
18 Sem_wait(mutex);
19 printf("child: %d\n", count++);
20 Sem_post(mutex);
21 }
22 exit(0);
23 }
24 /* родительский процесс */
25 for (i = 0; i < nloop; i++) {
26 Sem_wait(mutex);
27 printf("parent: %d\r\", count++);
28 Sem_post(mutex);
29 }
30 exit(0);
31 }