Можем ли мы получить файловый дескриптор для семафора или условной переменной? - PullRequest
5 голосов
/ 02 декабря 2010

У меня есть реализация двунаправленного канала сообщений, который, чтобы уменьшить накладные расходы, я реализовал в виде пары циклических буферов сообщений.Для записи с одного конца на другой вы добавляете указатель на сообщение в один циклический буфер и настраиваете для него индексы чтения и записи.Для записи в другом направлении вы делаете то же самое для другого буфера и так далее.Код небольшой и простой, и он позволяет избежать накладных расходов на использование канала или fifo, хотя, возможно, это могло бы быть лучшим решением в некоторых отношениях.

Я провел опрос по этому вопросу, просто проверив, было лисообщение, ожидающее чтения, и если не выполняется временное ожидание для условной переменной, которая получает сигнал при добавлении сообщения в соответствующий массив.

Теперь у меня есть приложение, которому нужно ждать в сокете (подробнееили меньше) и одновременно на канале сообщений.Мне бы хотелось, чтобы я использовал fifo или pipe, но из-за накладных расходов при изменении кода (длинная история) не реально переписать его для использования fifo или pipe.

Есть ли способполучить дескриптор файла, связанный с условной переменной?Если это так, то проще провести опрос сразу по двум файловым дескрипторам, один для условной переменной и один для сокета.

Из любопытства, что делает этот вопрос более полезным для других людей с похожей проблемой,Можно ли получить дескриптор файла, связанный с семафором, чтобы вы могли одновременно опрашивать семафор и обычный дескриптор файла?

Ответы [ 3 ]

7 голосов
/ 02 декабря 2010

Как правило, нет.Но разные ОС предлагают разные решения для вашей проблемы.

Windows

Вы можете связать событие с сокетом с WSAEventSelect и ждать с WaitForMultipleObjectsEx для данных о событиях сокета, мьютекса или семафора и т. д.

Linux

Вы можете использовать системный вызов futex с аргументом FUTEX_FD (однако он был удален изядро), или используйте eventfd для реализации условной переменной.

И вы можете создать второй поток, который будет ожидать переменную условия, и сообщить о том, что он ожидает в select ().Или запросите сигналы, когда вход поступает в гнездо и т. Д. См. этот связанный вопрос .

2 голосов
/ 02 декабря 2010

Файловый дескриптор - это индекс в управляемом ядром массиве открытых файлов и подобных объектов (каналов, FIFO, сокетов), поэтому невозможно связать файловый дескриптор с чем-либо, что не управляется ядром.

Если ваши каналы сообщений и семафоры полностью находятся в пространстве пользователя (реализовано в вашем собственном приложении с обращением к системным вызовам), то вы не можете получить дескриптор файла для него.К сожалению.

1 голос
/ 02 декабря 2010

Это что-то вроде хака, но вы могли бы заменить переменную условия конвейером.Поток чтения будет опрашивать / выбирать на стороне чтения и сокете.Поток, который записывает в ваш буфер, также записывает байт в канал, чтобы сигнализировать, что в буфере есть содержимое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...