Ответы:
Да, это эквивалентно, но, очевидно, только если вы скажете 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
.
mkfifo
и mknod
фактически являются программами, использующими mknod
системный вызов (не знал об этом системном вызове до сегодняшнего дня) для создания FIFO. Я полагаю, вы используете термины «FIFO» и «названный» взаимозаменяемо. Это одно и то же? Двунаправленные именованные каналы реализованы с помощью доменных сокетов Unix, верно?
Они эквивалентны, за исключением крайних границ портативности. mknod ... p
Первоначально это был единственный способ создания именованных каналов, но POSIX решил опустить его и mkfifo
вместо этого придумать , предположительно, потому что именованные каналы по своей природе являются более переносимой концепцией, чем все, что другие вещи mknod
могут сделать с устройствами и их старшими и младшими номерами. mknod
Системный вызов был также оставил из ранних verions в стандарте POSIX.
Так что, для переносимости в древние UNIX, mknod ... p
лучше. Для современных систем mkfifo
это немного лучше, хотя вряд ли вы найдете настоящий современный Unix, где mknod ... p
он не работает.
mkfifo(2)
действительно отдельный системный вызовmknod(2)
(но в итоге он будет делать то же самое, что иmknod(S_FIFO)
).