на главную | войти | регистрация | 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.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.


Непрерываемость системного вызова door_call | UNIX: взаимодействие процессов | Листинг 15.22. Клиент, перехватывающий сигнал SIGCHLD