Відповіді:
Так, це рівнозначно, але очевидно, лише якщо ви скажете 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)).