Читать «UNIX: взаимодействие процессов» онлайн - страница 240
Уильям Ричард Стивенс
gid_t dc_rgid; /* реальный идентификатор группы клиента */
pid_t dc_pid; /* идентификатор процесса клиента */
} door_cred_t;
В эту структуру помещается информация о клиенте при возвращении из вызова door_cred. В разделе 4.4 [21] подробно рассказывается о различиях между действующими и реальными идентификаторами пользователя и группы, а пример использования этой функции приведен в листинге. 15.5.
Обратите внимание, что эта функция не принимает никаких дескрипторов. Она возвращает информацию о клиенте, осуществившем конкретный вызов через дверь, и поэтому должна вызываться из процедуры сервера или другой функции, вызываемой из процедуры сервера.
15.6. Функция door_info
Только что описанная функция door_cred предоставляет серверу информацию о клиенте. Клиент же может получить информацию о сервере, вызвав doo_info:
#include <door.h>
int door_info(int
/* Возвращает 0 в случае успешного завершения, –1 – в случае ошибки */
Дескриптор
typedef struct doo_info {
pid_t di_target; /* идентификатор процесса сервера */
door_ptr_t di_proc; /* процедура сервера */
door_ptr_t di_data; /* принимаемые процедурой сервера данные */
door_attr_t di_attributes; /* атрибуты, связанные с данной дверью */
door_id_t di_uniquifier; /* уникальный номер двери */
} door info t;
Поле di_target содержит идентификатор процесса сервера, a di_proc — адрес процедуры сервера в процессе (от которого клиенту, вообще говоря, пользы мало). Указатель, передаваемый процедуре сервера в качестве первого аргумента
Текущие атрибуты двери помещаются в поле di_attributes, и два из них уже были описаны в разделе 15.3. Это атрибуты DOOR_PRIVATE и DOOR_UNREF. Два других атрибута называются DOOR_LOCAL (процедура является локальной для данного процесса) и DOOR_REVOKE (сервер аннулировал процедуру, связанную с этой дверью, вызвав door_revoke).
Каждой двери при создании сопоставляется уникальный в пределах системы номер, который возвращается в поле di_uniquifier.
Эта функция обычно вызывается клиентом для получения информации о сервере. Однако она может быть вызвана и из процедуры сервера, причем первым аргументом в этом случае должна быть константа DOOR_QUERY. Тогда функция возвратит информацию о вызвавшем потоке, то есть о данном экземпляре процедуры сервера. В этом случае адреса процедуры сервера и принимаемых аргументов (di_proc и di_data) могут представлять интерес.
15.7. Примеры
В этом разделе мы приведем примеры использования пяти только что описанных функций.
Функция door_info
В листинге 15.3 приведен текст программы, открывающей дверь и вызывающей door_infо для получения информации об этой двери, которая затем выводится на экран.
Листинг 15.3. Вывод информации о двери
//doors/doorinfo.c
1 #include "unpipc.h"