Читаем Разработка приложений в среде Linux. Второе издание полностью

int socketpair(int domain, int type, int protocol, int sockfds[2]);

Первые три параметра совпадают с теми, которые передаются в socket(). Последний параметр sockfds() заполняется функцией socketpair() двумя файловыми дескрипторами (по одному для каждой стороны сокета).

Пример применения socketpair() показан далее в главе.

<p>17.4.6. Передача файловых дескрипторов</p>

Сокеты домена Unix обладают уникальным свойством: через них могут передаваться файловые дескрипторы. Ни один из прочих механизмов IPC не поддерживает подобную возможность. Она позволяет процессу открыть файл и передать файловый дескриптор в другой (возможно, несвязанный) процесс. Все проверки доступа выполняются при открытии файла, поэтому получающий процесс приобретает те же самые права доступа к файлу, что и исходный процесс.

Файловые дескрипторы передаются как часть более сложного сообщения, которое отправляется с помощью системного вызова sendmsg() и принимается через recvmsg().

#include

int sendmsg(int fd, const struct msghdr * msg, unsigned int flags);

int recvmsg(int fd, struct msghdr * msg, unsigned int flags);

Параметр fd является файловым дескриптором, через который передается сообщение; второй параметр служит указателем на структуру, описывающую сообщение. Параметр flags обычно не используется и для большинства приложений должен быть равен нулю. В специализированных книгах по программированию для сетей обсуждаются доступные флаги [33].

Сообщение описывается показанной ниже структурой.

#include

#include

struct msghdr {

 void * msg_name;            /* дополнительный адрес */

 unsigned int msg_namelen;   /* размер msg_name */

 struct iovec * msg_iov;     /* массив для чтения вразброс/сборной записи*/

 unsigned int msg_iovlen;    /* количество элементов в msg_iov */

 void * msg_control;         /* вспомогательные данные */

 unsigned int msg_controllen;/* длина буфера вспомогательных данных */

 int msg_flags;              /* флаги на получаемом сообщении */

};

Первые два члена msg_name и msg_namelen не используются в потоковых протоколах. Приложения, посылающие сообщения через потоковые сокеты, должны устанавливать для msg_name значение NULL, для msg_namelen — ноль.

msg_iov и msg_iovlen описывают набор буферов, которые отправляют или принимают. Чтение вразброс и сборная запись, а также struct iovec, обсуждаются в конце главы 13. Последний член структуры msg_flags в настоящее время не используется и должен равняться нулю.

Два элемента, которые мы пропустили, msg_control и msg_controllen предоставляют возможность передачи файлового дескриптора. Член msg_control указывает на массив заголовков управляющих сообщений; msg_controllen устанавливает количество байт, которые содержит массив. Каждое управляющее сообщение состоит из структуры struct cmsghdr, которая сопровождается дополнительными данными.

#include

struct cmsghdr {

 unsigned int cmsg_len; /* длина управляющего сообщения */

 int cmsg_level;        /* SOL_SOCKET */

 int cmsg_type;         /* SCM_RIGHTS */

 int cmsg_data[0];      /* здесь должен быть файловый дескриптор */

};

Размер управляющего сообщения, включая заголовок, хранится в переменной cmsg_len. В текущий момент определен только один тип управляющих сообщений — SCM_RIGHTS, который передает файловые дескрипторы[125]. Для данного типа сообщений параметры cmsg_level и cmsg_type должны быть равны соответственно SOL_SOCKET и SCM_RIGHTS. Последний член cmsg_data является массивом нулевого размера. Это расширение gcc, которое позволяет приложению копировать данные в конец структуры (в следующей программе показан пример).

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

Перейти на страницу:

Похожие книги

1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT
Adobe InDesign CS3
Adobe InDesign CS3

Книга посвящена верстке и макетированию в программе Adobe InDesign CS3. Помимо того что в ней описываются возможности программы, рассматриваются также принципы и традиции верстки, приводятся примеры решения типичных задач. Все это позволит читателю не только овладеть богатым инструментарием программы, но и грамотно применять его.Материал книги разделен на логические части: теоретические сведения, инструментарий программы, решение задач, – а также рассчитан на два уровня подготовки читателей – начинающих и опытных пользователей, что выгодно отличает книгу от других изданий. Это позволит применять ее как новичкам для знакомства с программой, так и пользователям со стажем для пополнения своих знаний.

Владимир Гавриилович Завгородний , Владимир Завгородний

Программирование, программы, базы данных / Программное обеспечение / Книги по IT