Estou mais interessado em soquetes do que em arquivos comuns, mas basicamente quero saber se um processo pode "ver" um soquete como bloqueante onde outro processo pode vê-lo como não bloqueante. Eu estou supondo que sim, e que o kernel lida com tudo isso dependendo de quais opções foram usadas no syscall.
Acho que isso seria mais sobre soquetes de domínio Unix do que soquetes TCP, pois não acho que 2 processos diferentes possam usar o mesmo soquete TCP (mas posso estar errado)
Você adivinha errado.
A única propriedade que é descritor por arquivo e que pode ser alterada
fcntl(F_SETFD)
é oFD_CLOEXEC
sinalizador close-on-exec.Todas as outras propriedades são por objeto de arquivo ("abrir descrição de arquivo" na linguagem POSIX -- que pode ser alterada com
fcntl(F_SETFL)
), ou por inode.Definir o sinalizador de não bloqueio com
fcntl(F_SETFL, | O_NONBLOCK)
ou comioctl(FIONBIO)
afetará todos os descritores de arquivo que se referem a esse arquivo aberto. Também não há como tornar um arquivo não bloqueante apenas para leitura ou gravação.Isso está longe de ser o ideal - você também pode consultar este Q&A no StackOverflow, especialmente o link para a discussão do lkml sobre uma tentativa fracassada de corrigi-lo de alguma forma.
Observe que os arquivos regulares são basicamente não bloqueantes - um
poll(2)
ouselect(2)
neles retornará imediatamente.Se você estiver interessado apenas em soquetes, use
send(2)
ourecv(2)
com oMSG_DONTWAIT
sinalizador em vez deread(2)
ouwrite(2)
. Ao contrário do que você diz, um descritor de arquivo de soquete pode ser compartilhado entre processos e não importa qual seja sua família/protocolo/opções. E isso também se aplica a um soquete de escuta.A alteração de um descritor de arquivo em um processo para bloqueio ou não bloqueio não afeta outros descritores de arquivo do mesmo ou de outros processos. O_NONBLOCK é uma propriedade de um descritor de arquivo, não do arquivo ou soquete.Eu me lembrei errado. Para evitar isso, é preciso abrir os arquivos duas vezes (em vez de dup/fork) ou criar sockets duas vezes.E processos diferentes podem usar o mesmo soquete TCP. Veja esta pergunta . Eles podem até escrever no mesmo soquete, se estiverem sincronizados corretamente.