Чи названа труба створена `mknod`, а FIFO створена еквівалентом` mkfifo`?


22

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

Тепер я знаю, що mknodкоманда здатна створити названі труби. Ці названі труби еквівалентні FIFO, створені mkfifo, або вони мають різні особливості?

Відповіді:


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.


16
в той час як OP, безумовно, не хвилює, оскільки Q не позначено тегом [linux], зауважте, що на BSD mkfifo(2) дійсно є окремий системний виклик mknod(2)(але в кінцевому підсумку це робити точно так само, як mknod(S_FIFO)).
mosvy

@frostschutz - дякую за відмінну відповідь. Тож просто для уточнення речей. mkfifoі mknodце фактично програми, що використовують mknodсистемний виклик (раніше не знали про цей системний виклик) для створення FIFO. Ви використовуєте взаємозамінні терміни "FIFO" та "name". Вони однакові? Двонаправлені названі труби реалізовані за допомогою розеток домену 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не працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.