La pipa denominata creata da `mknod` e la FIFO creata da` mkfifo` equivalgono?


22

Ho usato il mkfifo <file>comando per creare FIFO denominati, in cui un processo scrive nel file e un altro processo legge dal file.

Ora so che il mknodcomando è in grado di creare pipe denominate. Queste pipe nominate sono equivalenti alle FIFO create da mkfifoo hanno caratteristiche diverse?

Risposte:


29

Sì, è equivalente, ma ovviamente solo se dici mknoddi creare effettivamente un FIFO, e non un dispositivo a blocchi o caratteri (raramente fatto come devtmpfs / udev fa per te).

mkfifo foobar
# same difference
mknod foobar p

In straceè identico per entrambi i comandi:

mknod("foobar", S_IFIFO|0666)           = 0

Quindi, in termini di syscalls, mkfifoè in realtà una scorciatoia per mknod.

La differenza più grande, quindi, è nella semantica. Con mkfifote puoi creare un sacco di FIFO in una volta sola:

mkfifo a b c

Con mknod, poiché devi specificare il tipo, accetta sempre e solo un argomento:

# wrong:
$ mknod a b c p
mknod: invalid major device number ‘c’
# right:
mknod a p
mknod b p
mknod c p

In generale, mknodpuò essere difficile da usare correttamente. Quindi, se vuoi lavorare con FIFO, segui mkfifo.


16
mentre all'OP sicuramente non importa, dal momento che Q non è taggato [linux], notate che su BSD mkfifo(2) è davvero una chiamata di sistema separata da mknod(2)(ma finirà per fare esattamente la stessa cosa mknod(S_FIFO)).
mosvy,

@frostschutz - grazie per un'ottima risposta. Quindi, solo per chiarire le cose. mkfifoe in mknodrealtà sono programmi che utilizzano la mknodchiamata di sistema (non conoscevo quella chiamata di sistema prima di oggi) per creare un FIFO. Usa i termini "FIFO" e "nominato" in modo intercambiabile, immagino. Sono la stessa cosa? Le pipe con nome bidirezionale vengono implementate tramite socket di dominio Unix, giusto?
Shuzheng,

Sì, "named pipe" e FIFO di solito si riferiscono alla stessa cosa (nel contesto delle pipe - FIFO è un concetto che esiste anche al di fuori delle pipe). Un socket è una bestia completamente diversa, alcune interessanti risposte a questo qui: unix.stackexchange.com/q/75904/30851
frostschutz

@frostschutz - grazie. Immagino che ciò che mi ha confuso di più sia che, quando penso alle pipe nominate, penso anche alle pipe bidirezionali - e un FIFO non è sicuramente bidirezionale (AFAIK).
Shuzheng,

@Shuzheng a FIFO non ha regole sulla direzione davvero. È davvero solo leggere e scrivere. Può esserci un numero qualsiasi di lettori e scrittori, ma qualsiasi cosa scritta può essere letta una sola volta, quindi non è chiaro chi alla fine otterrà i dati.
frostschutz,

18

Sono equivalenti tranne che ai limiti estremi della portabilità. mknod ... pera in origine l'unico modo per creare pipe denominate, ma POSIX ha scelto di ometterle e inventare mkfifoinvece, presumibilmente perché le named pipe sono un concetto intrinsecamente più portatile di tutto ciò che altre cose mknodpossono fare con i dispositivi e i loro numeri maggiori e minori. Anche la mknodchiamata di sistema è stata esclusa dalle prime versioni di POSIX.

Quindi, per la portabilità all'antica UNIX, mknod ... pè meglio. Per i sistemi moderni, mkfifoè leggermente migliore, anche se è abbastanza improbabile che troverai un vero unix moderno dove mknod ... pnon funziona.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.