Soquetes de domínio UNIX e FIFO podem compartilhar parte de sua implementação, mas são conceitualmente muito diferentes. O FIFO funciona em um nível muito baixo. Um processo grava bytes no pipe e outro lê a partir dele. Um soquete de domínio UNIX tem o mesmo comportamento de 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 vários clientes simultaneamente. O kernel fornece um novo descritor de arquivo sempre que connect(2)
ou accept(2)
é chamado no soquete. Os pacotes sempre vão para o processo certo.
Em um FIFO, isso seria impossível. Para comunicação bidirecional, você precisa de dois FIFOs e precisa de um par de FIFOs para cada um de seus clientes. Não há como escrever ou ler de maneira seletiva, porque são formas muito mais primitivas de se comunicar.
Tubulações anônimas e FIFOs são muito semelhantes. A diferença é que os pipes anônimos não existem como arquivos no sistema de arquivos, então nenhum processo pode open(2)
it. Eles são usados por processos que os compartilham por outro método. Se um processo abrir um FIFO e executar, por exemplo, um fork(2)
, seu filho herdará seus descritores de arquivo e, entre eles, o canal.
Os soquetes de domínio, os pipes anônimos e os FIFOs do UNIX são semelhantes no fato de usar segmentos de memória compartilhada. Os detalhes da implementação podem variar de um sistema para outro, mas a idéia é sempre a mesma: anexa a mesma parte da memória em dois mapeamentos de memória de processos distintos para que eles compartilhem dados
( edite: isso seria uma maneira óbvia de implementá-lo, mas não é como realmente é feito no Linux, que simplesmente usa a memória do kernel para os buffers, veja a resposta de @ tjb63 abaixo).
O kernel então manipula as chamadas do sistema e abstrai o mecanismo.