FIFO, канал и домен Unix, снабжают то же самое сокетом в ядре Linux?

Я - лично поклонник:

$ screen -rxU

- r возобновляет, что отдельная экранная сессия-x возобновляется не - отсоединился, экранная сессия-U говорит терминалу использовать кодировку UTF-8 (который я использую исключительно),

30
15.05.2013, 13:55
5 ответов

Сокеты домена UNIX и FIFO могут совместно использовать некоторую часть своей реализации, но они концептуально очень отличаются. FIFO функционирует на очень низком уровне. Байты записей процесса в канал и другой читает из него. Сокет домена UNIX имеет то же поведение как сокет TCP/IP.

Сокет двунаправлен и может использоваться большим количеством процессов одновременно. Процесс может принять много соединений на том же сокете и сопроводить несколько клиентов одновременно. Ядро поставляет новому дескриптору файла каждый раз connect(2) или accept(2) назван на сокете. Пакеты будут всегда переходить к правильному процессу.
На FIFO это было бы невозможно. Для двунаправленной коммуникации Вам нужны два FIFOs, и Вам нужна пара FIFOs для каждого из Ваших клиентов. Нет никакого способа записать или читать выборочным способом, потому что они - намного более примитивный способ связаться.

Неименованные каналы и FIFOs очень похожи. Различие - то, что неименованные каналы не существуют как файлы в файловой системе, таким образом, никакой процесс не может open(2) это. Они используются процессами, которые совместно используют их другим методом. Если процесс открывает FIFOs и затем работает, например, a fork(2), его ребенок наследует его дескрипторы файлов и, среди них, канала.

Сокеты домена UNIX, неименованные каналы и FIFOs подобны в факте, они используют сегменты общей памяти. Детали реализации могут варьироваться от одной системы до другого, но идея всегда является тем же: присоедините ту же часть памяти в двух отличных размещениях в ОЗУ процессов, чтобы иметь их обмен данными
(редактирование: это было бы один очевидный способ реализовать его, но это не то, как это на самом деле сделано в Linux, который просто использует память ядра для буферов, см. ответ @tjb63 ниже).
Ядро затем обрабатывает системные вызовы и абстрагирует механизм.

35
27.01.2020, 19:38
  • 1
    "сокеты домена UNIX и FIFO может совместно использовать некоторую часть их реализации"... точка является "некоторой частью"... Я просто понял, что моим вопросом является вид неоднозначных, и трудно быть отвеченным. Вероятно, что никто не мог знать столько деталей того, какие части они совместно используют в ядре (даже для разработчиков ядра). Тем не менее... кто-либо мог подтвердить, что сокет домена Unix, канал и FIFO они все буферизуют данные, отправляемые в общей памяти в соответствии с Linux? Если это подтверждено, мой вопрос решен. Хорошо... частично решенный. –  Justin 15.05.2013, 17:09
  • 2
    Ну, да, существует буфер, управляемый ядром. Например, с FIFOs, yoou может уничтожить устройство записи, и читатель может все еще, что было отправлено в канал перед смертью устройства записи. С сокетами это немного более сложно, потому что они функционируют со связанным протоколом. Но если Вы отправляете, скажем, интервал на сокет и затем выходите из объема так, чтобы интервал был очищен от стопки отправителя, получатель может все еще считать его. Так, где-нибудь существует ясно буфер. –  lgeorget 15.05.2013, 17:23
  • 3
    При Перечитывании комментария не уверенного, я ясен здесь... Сообщите мне, существует ли все еще что-то неясное. –  lgeorget 15.05.2013, 17:29
  • 4
    Ваш комментарий является четким мне. –  Justin 15.05.2013, 17:38

"FIFO" и "именованный канал" являются тем же самым - хотя это очень отличается от того, как оболочка обрабатывает "канал" (|) между двумя командами на командной строке.

Именованный канал (FIFO) является единственным "файлом", совместно использованным двумя программами, где каждый пишет в него и другое чтение от него... Сокет, с другой стороны, является "соединением" между двумя "файлами" - который может использовать сеть и быть на отдельных компьютерах - где одно чтение-записи программы в один "файл" и другую программу чтение-записи к другому... Я не думаю, что они настолько подобны... С другой стороны, и сокеты и именованные каналы - а также файлы, устройства, символьные ссылки - все использование inodes, и они все реализуют некоторые типичные опции (как чтение и запись).

4
27.01.2020, 19:38
  • 1
    Да, сокет домена Unix является видом сокета, таким образом, это - API, подобно другим API сокета, таким как TCP или UDP, и т.д. Однако сокет домена Unix может только использоваться в качестве "локального" IPC. И способ, которым это передает данные, находится способом метода "первым пришел - первым вышел", в значительной степени как FIFO и канал. Таким образом, я думаю, что это - возможный сокет домена Unix, API является просто другой инкапсуляцией идентичной реализации, таким образом, мы используем его, как будто это был сокет. Я думаю, что возможно, что они все совместно используют то же, внутреннее в ядре... Я хочу подтвердить, верно ли это или нет. –  Justin 15.05.2013, 15:49

Я не думаю так Justin. Если я не ошибаюсь, и я вполне возможно, я думаю, что FIFOs используют файл на диске, и сокеты Домена Unix используют память ядра.

Кроме того, как дополнение к плакату выше, кто упомянул, что сокеты домена Unix двунаправлены, который только имеет место при использовании сокета SOCK_STREAM. Сокеты домена SOCK_DGRAM Unix, на самом деле, однонаправлены, и могут только отправить () из кода, который назвал подключение () к коду, который звонил, связывают ().

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

1
27.01.2020, 19:38
  • 1
    Добро пожаловать на StackExchange и спасибо за регистрацию. Несколько комментариев... 1) Если Вы "вполне возможно" ошибаетесь, необходимо перепроверить перед ответом; этот сайт не является форумом, ни чатом. 2) Спасибо за Вашу точность на ориентированных сокетах датаграммы 3) нет никакой потребности отправить что-то, что "не имеет никакого отношения" к вопросу. :) –  lgeorget 02.07.2013, 23:51

Существует вполне хорошее обсуждение этого здесь: http://www.slideshare.net/divyekapoor/linux-kernel-implementation-of-pipes-and-fifos

Насколько я вижу, и из слайдов презентации и из источника http://lxr.free-electrons.com/source/fs/pipe.c - FIFO реализован как обертка вокруг канала, и канал самих реализован через pipefs виртуальную файловую систему..

@lgeorget - каналы, кажется, используют память ядра для буферов между средствами чтения и устройствами записи - они не используют 'общую память' как таковую, и копируют память между пользователем и адресными пространствами ядра (например, pipe_read вызовы pipe_iov_copy_to_user, который звонит __copy_to_user_inatomic (или copy_to_user). __copy_to_user_inatomic вызовы copy_user_generic, который идет нескольких реализаций ASM.

7
27.01.2020, 19:38

Мои 2 цента... Сокеты FIFO и UNIX являются двунаправленными -(похожими ), но сокеты имеют звездообразную топологию, а FIFO — это просто очередь (и, следовательно, не могут заменить друг друга ), да, их реализация может совместно использовать код внутри.

**

char * myfifo = "/tmp/myfifo";
mkfifo(myfifo, 0666);
fd = open(myfifo, O_RDWR);   //so that you can read/write to it
...
write(fd, buff1, sizeof(buff1));  
getchar();//wait till some one reds this and writes something else
int sz=read(fd, buff1, sizeof(buff1));  //read that something**
0
27.01.2020, 19:38

Теги

Похожие вопросы