Книга: UNIX: взаимодействие процессов

Досрочное завершение сервера

Досрочное завершение сервера

Если клиент блокируется в вызове door_call, ожидая получения результатов, ему нужно каким-то образом получить уведомление о завершении потока сервера по какой-либо причине. Посмотрим, что происходит в этом случае, прервав работу сервера вызовом pthread_exit. Это приведет к завершению потока сервера (а не всего процесса). В листинге 15.20 приведен текст процедуры сервера.

Листинг 15.20. Процедура сервера, завершающая работу сразу после запуска

//doors/serverintr1.c
1  #include "unpipc.h"
2  void
3  servproc(void *cookie, char *dataptr, size_t datasize,
4   door_desc_t *descptr, size_t ndesc)
5  {
6   long arg, result;
7   pthread_exit(NULL); /* посмотрим, что произойдет с клиентом */
8   arg = *((long*)dataptr);
9   result = arg * arg;
10  Door_return((char*)&result, sizeof(result), NULL, 0);
11 }

Оставшаяся часть сервера не претерпевает изменений по сравнению с листингом 15.2, а программу-клиент мы берем из листинга 15.1.

Запустив клиент, мы увидим, что вызов door_call возвращает ошибку EINTR, если процедура сервера завершается досрочно:

solaris % clientintr1 /tmp/door1 11
door_call error: Interrupted system call

Оглавление книги


Генерация: 0.744. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз