Соответствует ли именованный канал, созданный `mknod`, и FIFO, созданный` mkfifo`?


22

Я использовал mkfifo <file>команду для создания именованных FIFO, где один процесс записывает в файл, а другой - из файла.

Теперь я знаю, что mknodкоманда может создавать именованные каналы. Эти именованные каналы эквивалентны FIFO, созданным mkfifoили у них разные функции?

Ответы:


29

Да, это эквивалентно, но, очевидно, только если вы скажете mknodна самом деле создать FIFO, а не блочное или символьное устройство (это редко делается в наши дни, как это делает devtmpfs / udev).

mkfifo foobar
# same difference
mknod foobar p

В straceней одинаковые для обеих команд:

mknod("foobar", S_IFIFO|0666)           = 0

Так что с точки зрения системных вызовов, mkfifoэто на самом деле сокращение для mknod.

Самая большая разница в семантике. С помощью mkfifoвы можете создать кучу FIFO за один раз:

mkfifo a b c

С mknod, поскольку вы должны указать тип, он принимает только один аргумент:

# wrong:
$ mknod a b c p
mknod: invalid major device number ‘c’
# right:
mknod a p
mknod b p
mknod c p

В общем, mknodможет быть сложно правильно использовать. Так что если вы хотите работать с FIFO, придерживайтесь mkfifo.


16
в то время как OP, безусловно, не волнует, так как Q не помечен [linux], обратите внимание, что в BSD mkfifo(2) действительно отдельный системный вызов mknod(2)(но в итоге он будет делать то же самое, что и mknod(S_FIFO)).
Мосви

@frostschutz - спасибо за отличный ответ. Так что просто уточнить вещи. mkfifoи mknodфактически являются программами, использующими mknodсистемный вызов (не знал об этом системном вызове до сегодняшнего дня) для создания FIFO. Я полагаю, вы используете термины «FIFO» и «названный» взаимозаменяемо. Это одно и то же? Двунаправленные именованные каналы реализованы с помощью доменных сокетов Unix, верно?
Шужэн

Да, «именованный канал» и FIFO обычно означают одно и то же (в контексте каналов - FIFO - это концепция, которая существует и вне каналов). Сокет - это совсем другой зверь, здесь есть несколько интересных ответов: unix.stackexchange.com/q/75904/30851
frostschutz

@frostschutz - спасибо. Я думаю, что больше всего меня смутило то, что, когда я думаю о именованных каналах, я также думаю о двунаправленных каналах - и FIFO определенно не является двунаправленным (AFAIK).
Шужэн

@Shuzheng FIFO не имеет никаких правил на самом деле. Это действительно просто читать и писать. Может быть любое количество читателей и писателей, но все написанное может быть прочитано только один раз, поэтому неясно, кто получит данные в конце.
frostschutz

18

Они эквивалентны, за исключением крайних границ портативности. mknod ... pПервоначально это был единственный способ создания именованных каналов, но POSIX решил опустить его и mkfifoвместо этого придумать , предположительно, потому что именованные каналы по своей природе являются более переносимой концепцией, чем все, что другие вещи mknodмогут сделать с устройствами и их старшими и младшими номерами. mknodСистемный вызов был также оставил из ранних verions в стандарте POSIX.

Так что, для переносимости в древние UNIX, mknod ... pлучше. Для современных систем mkfifoэто немного лучше, хотя вряд ли вы найдете настоящий современный Unix, где mknod ... pон не работает.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.