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

22

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

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

Shuzheng
источник

Ответы:

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.

frostschutz
источник
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он не работает.


источник