Tak, jest to równoważne, ale oczywiście tylko wtedy, gdy powiesz, mknod
aby 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 strace
to identyczne dla obu poleceń:
mknod("foobar", S_IFIFO|0666) = 0
Jeśli chodzi o syscalls, mkfifo
to tak naprawdę jest skrótem mknod
.
Największą różnicą jest zatem semantyka. Dzięki mkfifo
niemu 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 mknod
prawidłowe użycie może być trudne. Więc jeśli chcesz pracować z FIFO, trzymaj się mkfifo
.
mkfifo(2)
tak naprawdę jest osobne wywołanie systemowemknod(2)
(ale w końcu robi dokładnie to samo, comknod(S_FIFO)
).mkfifo
imknod
tak naprawdę są programami używającymimknod
wywoł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?Są równoważne, z wyjątkiem skrajnych granic przenośności.
mknod ... p
był 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óremknod
mogą zrobić z urządzeniami oraz ich głównymi i mniejszymi liczbami.mknod
Wezwanie system został również pominięty wczesnych wersjach programu POSIX.Więc dla przenośności do starożytnego UNIX-a
mknod ... p
jest lepsza. W przypadku nowoczesnych systemówmkfifo
jest nieco lepszy, chociaż jest mało prawdopodobne, że znajdziesz rzeczywisty nowoczesny uniks, w którymmknod ... p
nie działa.źródło