Sim, é equivalente, mas obviamente apenas se você disser mknod
para realmente criar um FIFO, e não um dispositivo de bloco ou caractere (raramente feito atualmente como devtmpfs / udev faz isso por você).
mkfifo foobar
# same difference
mknod foobar p
Em strace
que é idêntico para ambos os comandos:
mknod("foobar", S_IFIFO|0666) = 0
Então, em termos de syscalls, mkfifo
é realmente uma abreviação de mknod
.
A maior diferença, então, está na semântica. Com mkfifo
você pode criar um monte de FIFOs de uma só vez:
mkfifo a b c
Com mknod
, como você precisa especificar o tipo, ele apenas aceita um argumento:
# wrong:
$ mknod a b c p
mknod: invalid major device number ‘c’
# right:
mknod a p
mknod b p
mknod c p
Em geral, mknod
pode ser difícil de usar corretamente. Portanto, se você deseja trabalhar com FIFO, atenha-se a mkfifo
.
mkfifo(2)
é realmente uma chamada de sistema separadamknod(2)
(mas isso acabará fazendo exatamente a mesma coisa quemknod(S_FIFO)
).mkfifo
emknod
na verdade são programas que usam amknod
chamada do sistema (não sabiam dessa chamada do sistema antes de hoje) para criar um FIFO. Você usa os termos "FIFO" e "nomeado" de forma intercambiável, eu acho. Eles são a mesma coisa? Os pipes nomeados bidirecionais são implementados por meio de soquetes de domínio Unix, certo?Eles são equivalentes, exceto nos extremos da portabilidade.
mknod ... p
era originalmente a única maneira de criar pipes nomeados, mas o POSIX optou por omiti-lo e inventá-lomkfifo
, presumivelmente porque os pipes nomeados são um conceito inerentemente mais portátil do que tudo o que outras coisasmknod
podem fazer com os dispositivos e seus números maiores e menores. Amknod
chamada do sistema também foi deixada de fora das primeiras versões do POSIX.Portanto, para portabilidade para o UNIX antigo,
mknod ... p
é melhor. Para sistemas modernos,mkfifo
é um pouco melhor, embora seja pouco provável que você encontre um unix moderno real ondemknod ... p
não funcione.fonte