Листинг 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 приведен текст процедуры сервера и обработчик отмены потока.