Soquetes de domínio UNIX e FIFO podem compartilhar parte de sua implementação, mas eles são conceitualmente muito diferentes. O FIFO funciona em um nível muito baixo. Um processo grava bytes no pipe e outro lê nele. Um soquete de domínio UNIX tem o mesmo comportamento que um soquete TCP / IP.
Um soquete é bidirecional e pode ser usado por muitos processos simultaneamente. Um processo pode aceitar muitas conexões no mesmo soquete e atender a vários clientes simultaneamente. O kernel entrega um novo descritor de arquivo a cada vez connect(2)
ou accept(2)
é chamado no soquete. Os pacotes sempre irão para o processo correto.
Em um FIFO, isso seria impossível. Para comunicação bidirecional, você precisa de dois FIFOs e um par de FIFOs para cada um de seus clientes. Não há como escrever ou ler de maneira seletiva, porque eles são uma maneira muito mais primitiva de se comunicar.
Canos anônimos e FIFOs são muito semelhantes. A diferença é que pipes anônimos não existem como arquivos no sistema de arquivos, portanto, nenhum processo pode existir open(2)
. Eles são usados por processos que os compartilham por outro método. Se um processo abrir um FIFOs e, em seguida, executar, por exemplo, a fork(2)
, seu filho herdará seus descritores de arquivo e, entre eles, o canal.
Os soquetes de domínio UNIX, pipes anônimos e FIFOs são semelhantes no fato de usarem segmentos de memória compartilhada. Os detalhes da implementação podem variar de um sistema para outro, mas a idéia é sempre a mesma: anexar a mesma porção de memória em dois processos distintos de mapeamento de memória para que eles compartilhem dados
( editar: isso seria uma maneira óbvia de implementá-lo, mas isso é não como é realmente feito no Linux, que simplesmente usa a memória do kernel para os buffers, veja a resposta em @ tjb63 abaixo).
O kernel então lida com as chamadas do sistema e abstrai o mecanismo.