на главную | войти | регистрация | 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.25. Клиент, досрочно завершающий работу после вызова door_call

//doors/clientintr4.c

1  #include "unpipc.h"


2  int

3  main(int argc, char **argv)

4  {

5   int fd;

6   long ival, oval;

7   door_arg_t arg;

8   if (argc != 3)

9    err_quit("usage: clientintr4 ");

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

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

12  ival = atol(argv[2]);

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

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

15  arg.desc_ptr = NULL;

16  arg.desc_num = 0;

17  arg.rbuf = (char*)&oval; /* возвращаемые данные */

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

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

20  alarm(3);

21  Door_call(fd, &arg);

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

23  exit(0);

24 }

20 Единственное изменение заключается в добавлении вызова alarm(3) перед door_call. Эта функция приводит к отправке сигнала SIGALRM через три секунды после вызова, но, поскольку мы его не перехватываем, это приводит к завершению процесса. Поэтому клиент завершится до возврата из door_call, потому что в процедуру сервера вставлена шестисекундная пауза.

В листинге 15.26 приведен текст процедуры сервера и обработчик отмены потока.


Досрочное завершение клиента | UNIX: взаимодействие процессов | Листинг 15.26. Процедура сервера, обрабатывающая досрочное завершение клиента