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?

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.