Непрерываемость системного вызова door_call

Непрерываемость системного вызова door_call

Документация на door_call предупреждает, что эта функция не предполагает возможности перезапуска (библиотечная функция door_call делает системный вызов с тем же именем). Мы можем убедиться в этом, изменив процедуру сервера таким образом, чтобы она делала паузу в 6 секунд перед возвращением, что показано в листинге 15.21.

Листинг 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.

Листинг 15.22. Клиент, перехватывающий сигнал SIGCHLD

//doors/clientintr2.c

1  #include "unpipc.h"

2  void

3  sig_chld(int signo)

4  {

5   return; /* просто прерываем door_call() */

6  }

7  int

8  main(int argc, char **argv)

9  {

10  int fd;

11  long ival, oval;

12  door_arg_t arg;

13  if (argc != 3)

14   err_quit("usage: clientintr2 <server-pathname> <integer-value>");

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

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

17  ival = atol(argv[2]);

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

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

20  arg.desc_ptr = NULL;

21  arg.desc_num = 0;

22  arg.rbuf = (char*)&oval; /* данные */

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

24  Signal(SIGCHLD, sig_chld);

25  if (Fork() == 0) {

26   sleep(2); /* дочерний процесс */

27   exit(0); /* отправка SIGCHLD */

28  }

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

30  Door_call(fd, &arg);

31  printf(result: %ld ", oval);

32  exit(0);

33 }

Клиенту будет возвращена та же ошибка, что и при досрочном завершении сервера — EINTR:

solaris % clientintr2 /tmp/door2 22

door_call error: interrupted system call

Поэтому нужно блокировать все сигналы, которые могут прервать вызов door_call.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

1.4. Методология системного анализа и системного моделирования

Из книги Самоучитель UML автора Леоненков Александр

1.4. Методология системного анализа и системного моделирования Системный анализ как научное направление имеет более давнюю историю, чем ООП и ООАП, и собственный предмет исследования. Центральным понятием системного анализа является понятие системы, под которой


Программирование с помощью таймеров обратного вызова

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Программирование с помощью таймеров обратного вызова Во многих приложениях возникает необходимость вызывать конкретный метод через регулярные промежутки времени. Например, в одном приложении может потребоваться отображение текущего времени в строке состояния с


Поддержка синхронного вызова

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

Поддержка синхронного вызова Генерируемый агент определяет также поддержку синхронного вызова Web-методов. Например, синхронный вариант метода Subtract() реализуется так.public int Subtract(int x, int y) { object[] results = this.invoke("Subtract", new object[] {x, y}); return ((int)(results[0]));}Обратите внимание на то, что


Поддержка асинхронного вызова

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

Поддержка асинхронного вызова Поддержка асинхронного вызова Web-методов в .NET 2.0 сильно изменилась по сравнению с .NET 1.x. По своему предыдущему опыту вы можете знать, что агенты .NET 1.1 использовали методы BeginXXX()/EndXXX() для вызова Web-методов во вторичном потоке выполнения.


7.3.2. Методы удаленного вызова процедур

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

7.3.2. Методы удаленного вызова процедур Несмотря немногочисленные исключения, такие как NFS (Network File System) и проект GNOM€, попытки заимствовать технологии CORBA, ASN.1 и другие формы интерфейса удаленного вызова процедур в основном провалились. Данные технологии не прижились в


7.3.2. Методы удаленного вызова процедур

Из книги О чём не пишут в книгах по Delphi автора Григорьев А. Б.

7.3.2. Методы удаленного вызова процедур Несмотря немногочисленные исключения, такие как NFS (Network File System) и проект GNOME, попытки заимствовать технологии CORBA, ASN.1 и другие формы интерфейса удаленного вызова процедур в основном провалились. Данные технологии не прижились в


15.2. Функция door_call

Из книги C++. Сборник рецептов автора Диггинс Кристофер

15.2. Функция door_call Функция door_call вызывается клиентом для обращения к процедуре сервера, выполняемой в адресном пространстве процесса-сервера:#include <door.h>int door_call(int fd, door_arg_t *argp);/* Возвращает 0 в случае успешного завершения. –1 – в случае ошибки */Дескриптор fd обычно


1.1.5. Функции обратного вызова

Из книги Linux программирование в примерах автора Роббинс Арнольд

1.1.5. Функции обратного вызова Прежде чем двигаться дальше, необходимо разобраться с тем, что такое функции обратного вызова (callback functions: этот термин иногда также переводят "функции косвенного вызова"). Эти функции в программе описываются, но обычно не вызываются напрямую,


15.1. Применение указателей функций для их обратного вызова

Из книги Операционная система UNIX автора Робачевский Андрей М.

15.1. Применение указателей функций для их обратного вызова ПроблемаПланируется использование некоторой функции func1, которая на этапе выполнения должна вызывать другую функцию func2. Однако по той или иной причине нельзя внутри функции func1 жестко закодировать имя функции


Семантика вызова

Из книги Разработка ядра Linux автора Лав Роберт

Семантика вызова Вызов локальной процедуры однозначно приводит к ее выполнению, после чего управление возвращается в головную программу. Иначе дело обстоит при вызове удаленной процедуры. Невозможно установить, когда конкретно будет выполняться процедура, будет ли она


15.5. Оператор вызова функции

Из книги автора

15.5. Оператор вызова функции Оператор вызова функции может быть перегружен для объектов типа класса. (Мы уже видели, как он используется, при рассмотрении объектов-функций в разделе 12.3.) Если определен класс, представляющий некоторую операцию, то для ее вызова


18.5.3. Порядок вызова конструкторов и деструкторов

Из книги автора

18.5.3. Порядок вызова конструкторов и деструкторов Виртуальные базовые классы всегда конструируются перед невиртуальными, вне зависимости от их расположения в иерархии наследования. Например, в приведенной иерархии у класса TeddyBear (плюшевый мишка) есть два виртуальных


Определение необходимого системного вызова

Из книги автора

Определение необходимого системного вызова Простой переход в пространство ядра сам по себе не является достаточным, потому что существует много системных вызовов, каждый из которых осуществляет переход в режим ядра одинаковым образом. Поэтому ядру должен передаваться


Контекст системного вызова

Из книги автора

Контекст системного вызова Как уже обсуждалось в главе 3, "Управление процессами", при выполнении системного вызова ядро работает в контексте процесса. Указатель current указывает на текущее задание, которое и есть процессом, выполняющим системный вызов.В контексте процесса


Окончательные шаги регистрации системного вызова

Из книги автора

Окончательные шаги регистрации системного вызова После того как системный вызов написан, процедура его регистрации в качестве официального системного вызова тривиальна и состоит в следующем.• Добавляется запись в конец таблицы системных вызовов. Это необходимо