Я - лично поклонник:
$ screen -rxU
- r возобновляет, что отдельная экранная сессия-x возобновляется не - отсоединился, экранная сессия-U говорит терминалу использовать кодировку UTF-8 (который я использую исключительно),
Сокеты домена UNIX и FIFO могут совместно использовать некоторую часть своей реализации, но они концептуально очень отличаются. FIFO функционирует на очень низком уровне. Байты записей процесса в канал и другой читает из него. Сокет домена UNIX имеет то же поведение как сокет TCP/IP.
Сокет двунаправлен и может использоваться большим количеством процессов одновременно. Процесс может принять много соединений на том же сокете и сопроводить несколько клиентов одновременно. Ядро поставляет новому дескриптору файла каждый раз connect(2)
или accept(2)
назван на сокете. Пакеты будут всегда переходить к правильному процессу.
На FIFO это было бы невозможно. Для двунаправленной коммуникации Вам нужны два FIFOs, и Вам нужна пара FIFOs для каждого из Ваших клиентов. Нет никакого способа записать или читать выборочным способом, потому что они - намного более примитивный способ связаться.
Неименованные каналы и FIFOs очень похожи. Различие - то, что неименованные каналы не существуют как файлы в файловой системе, таким образом, никакой процесс не может open(2)
это. Они используются процессами, которые совместно используют их другим методом. Если процесс открывает FIFOs и затем работает, например, a fork(2)
, его ребенок наследует его дескрипторы файлов и, среди них, канала.
Сокеты домена UNIX, неименованные каналы и FIFOs подобны в факте, они используют сегменты общей памяти. Детали реализации могут варьироваться от одной системы до другого, но идея всегда является тем же: присоедините ту же часть памяти в двух отличных размещениях в ОЗУ процессов, чтобы иметь их обмен данными
(редактирование: это было бы один очевидный способ реализовать его, но это не то, как это на самом деле сделано в Linux, который просто использует память ядра для буферов, см. ответ @tjb63 ниже).
Ядро затем обрабатывает системные вызовы и абстрагирует механизм.
"FIFO" и "именованный канал" являются тем же самым - хотя это очень отличается от того, как оболочка обрабатывает "канал" (|) между двумя командами на командной строке.
Именованный канал (FIFO) является единственным "файлом", совместно использованным двумя программами, где каждый пишет в него и другое чтение от него... Сокет, с другой стороны, является "соединением" между двумя "файлами" - который может использовать сеть и быть на отдельных компьютерах - где одно чтение-записи программы в один "файл" и другую программу чтение-записи к другому... Я не думаю, что они настолько подобны... С другой стороны, и сокеты и именованные каналы - а также файлы, устройства, символьные ссылки - все использование inodes, и они все реализуют некоторые типичные опции (как чтение и запись).
Я не думаю так Justin. Если я не ошибаюсь, и я вполне возможно, я думаю, что FIFOs используют файл на диске, и сокеты Домена Unix используют память ядра.
Кроме того, как дополнение к плакату выше, кто упомянул, что сокеты домена Unix двунаправлены, который только имеет место при использовании сокета SOCK_STREAM. Сокеты домена SOCK_DGRAM Unix, на самом деле, однонаправлены, и могут только отправить () из кода, который назвал подключение () к коду, который звонил, связывают ().
Конечно, код, который назвал подключение () должен также звонить, связывают () для создания своей собственной конечной точки, но это не имеет никакого отношения вопросу.
Существует вполне хорошее обсуждение этого здесь: 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.
Мои 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**