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


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




Листинг 15.22. Клиент, перехватывающий сигнал SIGCHLD

//doors/clientintr2.c

1  #include "unpipc.h"


2  void

3  sig_chld(int signo)

4  {

5   return; /* просто прерываем door_call() */

6  }


7  int

8  main(int argc, char **argv)

9  {

10  int fd;

11  long ival, oval;

12  door_arg_t arg;

13  if (argc != 3)

14   err_quit("usage: clientintr2 ");

15  fd = Open(argv[1], O_RDWR); /* открываем дверь */

16  /* подготовка аргументов и указателя на результат */

17  ival = atol(argv[2]);

18  arg.data_ptr = (char*)&ival; /* аргументы */

19  arg.data_size = sizeof(long); /* размер аргументов */

20  arg.desc_ptr = NULL;

21  arg.desc_num = 0;

22  arg.rbuf = (char*)&oval; /* данные */

23  arg.rsize = sizeof(long); /* размер данных */

24  Signal(SIGCHLD, sig_chld);

25  if (Fork() == 0) {

26   sleep(2); /* дочерний процесс */

27   exit(0); /* отправка SIGCHLD */

28  }

29  /* вызов процедуры сервера и вывод результата */

30  Door_call(fd, &arg);

31  printf(result: %ld\n", oval);

32  exit(0);

33 }

Клиенту будет возвращена та же ошибка, что и при досрочном завершении сервера — EINTR:

solaris % clientintr2 /tmp/door2 22

door_call error: interrupted system call

Поэтому нужно блокировать все сигналы, которые могут прервать вызов door_call.


Листинг 15.21. Процедура сервера делает паузу в 6 секунд | UNIX: взаимодействие процессов | Идемпотентные и неидемпотентные процедуры