Відповіді:
Так, це рівнозначно, але очевидно, лише якщо ви скажете 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" та "name". Вони однакові? Двонаправлені названі труби реалізовані за допомогою розеток домену Unix, правда?
Вони рівноцінні, за винятком крайніх країв переносимості. mknod ... p
спочатку був єдиним способом створення названих труб, але POSIX вирішив опустити його та винайти mkfifo
замість цього, мабуть, тому, що названі труби є по суті більш портативною концепцією, ніж усі, що інші речі mknod
можуть робити з пристроями та їх основною та незначною кількістю. mknod
Системний виклик був також залишив з ранніх verions в стандарті POSIX.
Отже, для портативності до стародавнього UNIX mknod ... p
краще. Для сучасних систем mkfifo
це трохи краще, хоча навряд чи ви знайдете справжній сучасний Unix, де mknod ... p
не працює.
mkfifo(2)
дійсно є окремий системний викликmknod(2)
(але в кінцевому підсумку це робити точно так само, якmknod(S_FIFO)
).