Ответы:
Да, это эквивалентно, но, очевидно, только если вы скажете 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)).