Czy nazwany potok utworzony przez `mknod` i FIFO utworzony przez` mkfifo` są równoważne?

22

Użyłem tego mkfifo <file>polecenia do utworzenia nazwanych FIFO, w których jeden proces zapisuje do pliku, a inny proces czyta z pliku.

Teraz wiem, że mknodpolecenie może tworzyć nazwane potoki. Czy te nazwane potoki są równoważne utworzonym przez FIFO mkfifo, czy też mają różne funkcje?

Shuzheng
źródło

Odpowiedzi:

29

Tak, jest to równoważne, ale oczywiście tylko wtedy, gdy powiesz, mknodaby rzeczywiście utworzyć FIFO, a nie urządzenie blokowe lub znakowe (rzadko robi się to obecnie, ponieważ devtmpfs / udev robi to za Ciebie).

mkfifo foobar
# same difference
mknod foobar p

W straceto identyczne dla obu poleceń:

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

Jeśli chodzi o syscalls, mkfifoto tak naprawdę jest skrótem mknod.

Największą różnicą jest zatem semantyka. Dzięki mkfifoniemu możesz stworzyć kilka FIFO za jednym razem:

mkfifo a b c

Ponieważ mknod, ponieważ musisz określić typ, akceptuje tylko jeden argument:

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

Zasadniczo mknodprawidłowe użycie może być trudne. Więc jeśli chcesz pracować z FIFO, trzymaj się mkfifo.

frostschutz
źródło
16
podczas gdy OP z pewnością nie przejmuje się tym, ponieważ Q nie jest oznaczony [linux], zauważ, że na BSD mkfifo(2) tak naprawdę jest osobne wywołanie systemowe mknod(2)(ale w końcu robi dokładnie to samo, co mknod(S_FIFO)).
mosvy
@frostschutz - dziękuję za doskonałą odpowiedź. Żeby wyjaśnić. mkfifoi mknodtak naprawdę są programami używającymi mknodwywołania systemowego (wcześniej nie znałem tego wywołania systemowego) do utworzenia FIFO. Chyba używasz terminów „FIFO” i „nazwany” zamiennie. Czy to to samo? Dwukierunkowe nazwane potoki są implementowane za pomocą gniazd domeny Unix, prawda?
Shuzheng
Tak, „nazwany potok” i FIFO zwykle odnoszą się do tej samej rzeczy (w kontekście potoków - FIFO to koncepcja, która istnieje również poza potokami). Gniazdo to zupełnie inna bestia, kilka ciekawych odpowiedzi na to tutaj: unix.stackexchange.com/q/75904/30851
frostschutz
@frostschutz - dziękuję. Myślę, że najbardziej pomieszało mnie to, że kiedy myślę o nazwanych rurach, myślę także o rurach dwukierunkowych - a FIFO zdecydowanie nie jest dwukierunkowy (AFAIK).
Shuzheng
@Shuzheng FIFO tak naprawdę nie ma żadnych zasad dotyczących kierunku. To naprawdę tylko czytać i pisać. Może istnieć dowolna liczba czytelników i pisarzy, ale wszystko, co napisano, można odczytać tylko raz, więc nie jest jasne, kto w końcu uzyska dane.
frostschutz
18

Są równoważne, z wyjątkiem skrajnych granic przenośności. mknod ... pbył pierwotnie jedynym sposobem tworzenia nazwanych potoków, ale POSIX postanowił je pominąć i wymyślić mkfifo, prawdopodobnie dlatego, że nazwane potoki są z natury bardziej przenośne niż wszystkie inne rzeczy, które mknodmogą zrobić z urządzeniami oraz ich głównymi i mniejszymi liczbami. mknodWezwanie system został również pominięty wczesnych wersjach programu POSIX.

Więc dla przenośności do starożytnego UNIX-a mknod ... pjest lepsza. W przypadku nowoczesnych systemów mkfifojest nieco lepszy, chociaż jest mało prawdopodobne, że znajdziesz rzeczywisty nowoczesny uniks, w którym mknod ... pnie działa.


źródło