Se os descritores de arquivo são específicos para cada processo (ou seja, dois processos podem usar o mesmo id de descritor de arquivo para se referir a diferentes arquivos abertos), então como é possível compartilhar os descritores de arquivo de transferência (por exemplo, para mmaps compartilhados) em soquetes etc?
Ele depende do kernel sendo mapeado para o mesmo intervalo de endereços numéricos em cada processo?
Quando você compartilha um descritor de arquivo em um soquete, o kernel faz a mediação. Você precisa preparar os dados usando as
cmsg(3)
macros , enviá-lossendmsg(2)
e recebê-los usandorecvmsg(2)
. O kernel está envolvido nas duas últimas operações e lida com a conversão de um descritor de arquivo para quaisquer dados necessários para transmitir o descritor de arquivo e tornando o descritor de arquivo disponível no processo de recebimento.Como o mesmo fd em processos diferentes pode apontar para o mesmo arquivo? fornece informações úteis. O processo de envio envia um descritor de arquivo que significa algo em relação à sua tabela de descritores de arquivo (privada); o kernel sabe o que isso mapeia na tabela de arquivos abertos em todo o sistema e cria uma nova entrada conforme necessário na tabela de descritores de arquivo do processo receptor.