O pipe nomeado criado por `mknod` e o FIFO criado por` mkfifo` são equivalentes?

22

Eu usei o mkfifo <file>comando para criar FIFOs nomeados, onde um processo grava no arquivo e outro processo lê no arquivo.

Agora, eu sei que o mknodcomando é capaz de criar pipes nomeados. Esses pipes nomeados são equivalentes aos FIFOs criados por mkfifoou possuem recursos diferentes?

Shuzheng
fonte

Respostas:

29

Sim, é equivalente, mas obviamente apenas se você disser mknodpara 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 straceque é 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 mkfifovocê 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, mknodpode ser difícil de usar corretamente. Portanto, se você deseja trabalhar com FIFO, atenha-se a mkfifo.

frostschutz
fonte
16
embora o OP certamente não se importe, já que o Q não está marcado [linux], observe que no BSD mkfifo(2) é realmente uma chamada de sistema separada mknod(2)(mas isso acabará fazendo exatamente a mesma coisa que mknod(S_FIFO)).
mosvy
@frostschutz - obrigado por uma excelente resposta. Então, apenas para esclarecer as coisas. mkfifoe mknodna verdade são programas que usam a mknodchamada 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?
Shuzheng
Sim, "pipe nomeado" e FIFO geralmente se refere à mesma coisa (no contexto de pipes - FIFO é um conceito que existe fora dos pipes também). Um soquete é um animal completamente diferente, algumas respostas interessantes para isso aqui: unix.stackexchange.com/q/75904/30851
frostschutz
@frostschutz - obrigado. Acho que o que mais me confundiu é que, quando penso em pipes nomeados, também penso em pipes bidirecionais - e um FIFO definitivamente não é bidirecional (AFAIK).
Shuzheng
@Shuzheng um FIFO realmente não tem nenhuma regra de direção. É realmente apenas ler e escrever. Pode haver qualquer número de leitores e escritores, mas qualquer coisa escrita pode ser lida apenas uma vez, por isso não está claro quem obteria os dados no final.
frostschutz 30/07
18

Eles são equivalentes, exceto nos extremos da portabilidade. mknod ... pera originalmente a única maneira de criar pipes nomeados, mas o POSIX optou por omiti-lo e inventá-lo mkfifo, presumivelmente porque os pipes nomeados são um conceito inerentemente mais portátil do que tudo o que outras coisas mknodpodem fazer com os dispositivos e seus números maiores e menores. A mknodchamada 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 onde mknod ... pnão funcione.


fonte