Альтернатива именованным каналам Windows в Linux

Мы переносим существующий код Windows на Linux. Мы используем ACE в качестве уровня абстракции. Мы используем именованные каналы Windows для связи с несколькими клиентами и для выполнения перекрывающихся операций.

Что эквивалентно этому в linux. Я проверил именованные каналы Linux (FIFO), но они, похоже, поддерживают только одного клиента и сервер и не поддерживают перекрывающийся ввод-вывод.

Можете ли вы направить меня по этому поводу.


person Sirish    schedule 19.08.2010    source источник


Ответы (3)


Unix-сокеты. По сути,

  1. Звоните socket(PF_UNIX, SOCK_STREAM, 0). Это возвращает дескриптор файла или -1 в случае ошибки.
  2. Используйте что-то вроде struct sockaddr_un addr; bzero(addr); addr.sun_len = sizeof(addr); addr.sun_family = PF_UNIX; strncpy(addr.sun_path, "/path/to/file", sizeof(addr.sun_path)-1); для создания адреса сокета.
  3. Звоните bind(fd, &addr, sizeof(addr)).
  4. вызовите listen(fd,backlog) для прослушивания подключений. backlog — это количество непринятых (непринятых) соединений, которые могут существовать.
  5. Используйте accept() для приема соединений от клиентов. Это возвращает новый FD или -1 в случае ошибки.
  6. Попросите клиентов создать аналогичный сокет и подключить() к адресу (я не думаю, что они должны привязываться).
  7. Удалите файл /path/to/file, когда закончите (или просто оставьте его там, если вы собираетесь использовать его позже).

Я не уверен, поддерживается ли SOCK_DGRAM для сокетов Unix (если да, то, вероятно, это похоже на UDP).

См. справочные страницы для socket(2), bind(2), listen(2), accept(2), connect(2), unix(4), setsockopt(2).

Для «перекрывающихся вводов-выводов» см. select(2). Вы можете дополнительно включить неблокирующий ввод-вывод с помощью fcntl(fd,F_SETFL,(int)(fcntl(fd,F_GETFL)|O_NONBLOCK)) (см. fcntl(2)), это означает, что read() и write() никогда не блокируются (что означает, что write() может возвращать короткий результат, поэтому вам нужно посмотреть на возвращаемое значение).

Я не совсем уверен, как именованные каналы Windows представляют несколько соединений от нескольких клиентов, но в UNIX вы получаете один файловый дескриптор для каждого соединения (плюс один для «слушающего» сокета).

person tc.    schedule 19.08.2010

Насколько я помню, они используют fork() и stdin/stdout и/или сокеты. Я сделал это на Python, но у него есть хорошая оболочка IPC очень высокого уровня, поэтому я не уверен, как именно она работает на * nix.

В чем я почти уверен, так это в том, что не существует такой вещи, как перекрывающийся ввод-вывод, по крайней мере, в Windows. Примитивы блокировки также отстой по сравнению с Windows, хотя сокеты, как правило, ведут себя лучше.

Так что изучите fork() и все, что связано с IPC. Вы можете инвестировать в хороший ссылку как Что ж. Я думаю, что эта книга эквивалентна фолианту Харта в Windows.

person kprobst    schedule 19.08.2010

Если связь является локальной, используйте сокеты домена unix или сокеты TCP. Сокеты домена Unix могут получать учетные данные вызывающего процесса.

Если это в сети, используйте сокеты TCP.

Обратите внимание, что некоторые функции именованных каналов Windows не поддерживаются — вы не можете передавать учетные данные через сокет TCP, поэтому вам нужно будет спроектировать свой протокол, чтобы он не требовал их.

person MarkR    schedule 19.08.2010