на главную | войти | регистрация | DMCA | контакты | справка | donate |      

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я


моя полка | жанры | рекомендуем | рейтинг книг | рейтинг авторов | впечатления | новое | форум | сборники | читалки | авторам | добавить



Функция sem_open

В листинге 10.37 приведен текст первой половины функции sem_open, которая создает новый семафор или открывает существующий.

Листинг 12.2. Родительский и дочерний процессы увеличивают значение счетчика в разделяемой памяти

//shm/incr2.c

1  #include "unpipc.h"

2  #define SEM_NAME "mysem"


3  int

4  main(int argc, char **argv)

5  {

6   int fd, i, nloop, zero = 0;

7   int *ptr;

8   sem_t *mutex;

9   if (argc != 3)

10   err_quit("usage: incr2 <#loops>");

11  nloop = atoi(argv[2]);

12  /* открываем файл, инициализируем нулем и отображаем в память */

13  fd = Open(argv[1], O_RDWR | O_CREAT, FILE_MODE);

14  Write(fd, &zero, sizeof(int));

15  ptr = Mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

16  Close(fd);

17  /* создаем, инициализируем и отключаем семафор */

18  mutex = Sem_open(Px_ipc_name(SEM_NAME), O_CREAT | O_EXCL, FILE_MODE, 1);

19  Sem_unlink(Px_ipc_name(SEM_NAME));

20  setbuf(stdout, NULL); /* stdout не буферизуется */

21  if (Fork() == 0) { /* дочерний процесс */

22   for (i = 0; i < nloop; i++) {

23    Sem_wait(mutex);

24    printf("child: %d\n", (*ptr)++);

25    Sem_post(mutex);

26   }

27   exit(0);

28  }

29  /* родительский процесс */

30  for (i = 0; i < nloop; i++) {

31   Sem_wait(mutex);

32   printf("parent: %d\n", (*ptr)++);

33   Sem_post(mutex);

34  }

35  exit(0);

36 }


Тип данных sem_t | UNIX: взаимодействие процессов | Листинг 10.37. Функция sem_open: первая часть