Альтернатива Windows NAmed Pipes в Linux - PullRequest
3 голосов
/ 19 августа 2010

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

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

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

Ответы [ 3 ]

4 голосов
/ 19 августа 2010

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. Call bind(fd, &addr, sizeof(addr)).
  4. call listen(fd,backlog)слушать связи.backlog - это количество возможных соединений un-accept ().
  5. Используйте accept () для принятия соединений от клиентов.Это возвращает новый FD или -1 при ошибке.
  6. Пусть клиенты создадут аналогичный сокет и подключатся () к адресу (я не думаю, что они должны связываться).
  7. Удалитеfile / 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 () может возвращать short, поэтому вам нужно посмотреть на возвращаемое значение).

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

0 голосов
/ 19 августа 2010

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

Если он подключен к сети, используйте сокеты TCP.

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

0 голосов
/ 19 августа 2010

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

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

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

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