Листинг 12.3. Счетчик и семафор размещены в разделяемой памяти
//shm/incr3.c
1 #include "unpipc.h"
2 struct shared {
3 sem_t mutex; /* взаимное исключение: семафор, размещаемый в памяти */
4 int count; /* и счетчик */
5 } shared;
6 int
7 main(int argc, char **argv)
8 {
9 int fd, i, nloop;
10 struct shared *ptr;
11 if (argc != 3)
12 err_quit("usage: incr3
13 nloop = atoi(argv[2]);
14 /* открываем файл, инициализируем нулем, отображаем в память */
15 fd = Open(argv[1], O_RDWR | O_CREAT, FILE_MODE);
16 Write(fd, &shared, sizeof(struct shared));
17 ptr = Mmap(NULL, sizeof(struct shared), PROT_READ | PROT_WRITE,
18 MAP_SHARED, fd, 0);
19 Close(fd);
20 /* инициализация семафора, совместно используемого процессами */
21 Sem_init(&ptr->mutex, 1, 1);
22 setbuf(stdout, NULL); /* stdout не буферизуется */
23 if (Fork() == 0) { /* дочерний процесс */
24 for (i = 0; i < nloop; i++) {
25 Sem_wait(&ptr->mutex);
26 printf("child: %d\n", ptr->count++);
27 Sem_post(&ptr->mutex);
28 }
29 exit(0);
30 }
31 /* родительский процесс */
32 for (i = 0; i < nloop; i++) {
33 Sem_wait(&ptr->mutex);
34 printf("parent: %d\n", ptr->count++);
35 Sem_post(&ptr->mutex);
36 }
37 exit(0);
38 }