на главную | войти | регистрация | 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
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я


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



Листинг Г.6. Возвращает ли sem_wait ошибку EINTR?

//pxsem/testeintr.c

1  #include "unpipc.h"

2  #define NAME "testeintr"

3  static void sig_alrm(int);


4  int

5  main(int argc, char **argv)

6  {

7   sem_t *sem1, sem2;

8   /* именованный семафор */

9   sem_unlink(Px_ipc_name(NAME));

10  sem1 = Sem_open(Px_ipc_name(NAME), O_RDWR | O_CREAT | О_EXCL,

11   FILE_MODE, 0);

12  Signal(SIGALRM, sig_alrm);

13  alarm(2);

14  if (sem_wait(sem1) == 0)

15   printf("sem_wait returned 0?\n");

16  else

17   err_ret("sem_wait error");

18  Sem_close(sem1);

19  /* размещаемый в памяти семафор */

20  Sem_init(&sem2, 1, 0);

21  alarm(2);

22  if (sem_wait(&sem2) == 0)

23   printf("sem_wait returned 0?\n");

24  else

25   err_ret("sem_wait error");

26  Sem_destroy(&sem2);

27  exit(0);

28 }


29 static void

30 sig_alrm(int signo)

31 {

32  printf("SIGALRM caught\n");

33  return;

34 }

Реализация с использованием FIFO возвращает EINTR, поскольку sem_wait блокируется в вызове read, который должен возвращать такую ошибку. Реализация с использованием отображения в память ошибки не возвращает, поскольку sem_wait блокируется в вызове pthread_cond_wait, а эта функция не возвращает такой ошибки. Реализация с использованием семафоров System V возвращает ошибку EINTR, поскольку sem_wait блокируется в вызове semop, которая возвращает эту ошибку.

9. Реализация с использованием каналов (листинг 10.25) является защищенной, поскольку таковой является операция write. Реализация с отображением в память защищенной не является, поскольку функции pthread_XXX не являются защищенными и не могут вызываться из обработчика сигналов. Реализация с семафорами System V (листинг 10.41) также не является защищенной, поскольку semop не является защищенной функцией согласно Unix 98.


Глава 10 | UNIX: взаимодействие процессов | Глава 11