Листинг 15.21. Процедура сервера делает паузу в 6 секунд
//doors/serverintr2.с
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 sleep(6); /* клиент получает сигнал SIGCHLD */
8 arg = *((long*)dataptr);
9 result = arg * arg;
10 Door_return((char*)&result, sizeof(result), NULL, 0);
11 }
Изменим теперь клиент из листинга 15.2: установим обработчик сигнала SIGCHLD, добавив порождение процесса и завершение порожденного процесса через 2 секунды. Таким образом, через 2 секунды после вызова door_call дочерний процесс завершит работу, а родительский перехватит сигнал SIGCHLD и произойдет возврат из обработчика сигнала, прерывающий системный вызов door_call. Текст программы-клиента показан в листинге 15.22.