Primeiro de tudo - eu sei fifos para IPC, mas li sobre soquetes de domínio unix , que são bidirecionais e eu queria testar isso, o que é possível com linha de comando e bash.
Perguntei ao Chat GPT, mas as informações que obtive foram inúteis e os exemplos não funcionaram.
Eu queria conseguir que dois processos pudessem escrever simultaneamente um para o outro ou ler, sem o conceito de um fifo.
Se eu definir um descritor de arquivo para leitura em um fifo. eu também posso escrever com dois processos ou mais para o fifo. mas os dados são misturados, e o primeiro leitor lê todo o conteúdo misturado.
o processo A deve receber o que o processo B escreve, e o processo B deve receber o que o processo A escreve.
Consegui fazer isso funcionar com o seguinte código de teste:
arquivo bash: processA
while true; do
for ((i=0;i<10;i++)); do
echo "$((i+1))A" > "/proc/$PID/fd/6";
sleep 1;
done
while read -t 0.01 dataB; do echo "Received from process B: $dataB"; done
done
Arquivo bash: processB
while true; do
for ((i=0;i<10;i++)); do
echo "$((i+1))B";
sleep 0.5;
done
while read -t 0.01 dataA <"/proc/$PID/fd/5"; do echo "Received from process A: $dataA" > /dev/tty; done
done
terminal 1:
exec 6> >(nc -lU unixSocket | PID=$$ bash processA)
No Processo A :
Depois disso, posso escrever no soquete Unix por meio de "/proc/$PID/fd/6",
ler do soquete Unix com stdin
e o stdout vai para o terminal.
terminal 2:
exec 5< <(PID=$$ bash processB | nc -U unixSocket)
No Processo B :
Depois disso, posso escrever no soquete Unix com stdout,
ler do soquete Unix com "/proc/$PID/fd/5",
escrever no terminal com /dev/ttx
e stdin no teclado.
Primeira pergunta: Por que os descritores de arquivo 5 e 6 não são herdados dos subprocessos abertos na substituição de processo?
Tenho que obtê-los exportando o PID - por quê?
Segunda pergunta: os processos A e B podem se comunicar bidirecionalmente, mas preciso abrir mais dois processos principais, que estão executando o comando exec para redirecionamento do descritor de arquivo e iniciando a substituição do processo exec 5< <(PID=$$ bash processB | nc -U unixSocket)
.
Mas o que eu finalmente quero é uma comunicação entre o processo principal e o processo filho, e nada mais.
Agora eu tenho: o principal 1 abre o filho 1, o principal 2 abre o filho 2, e o filho 1 pode se comunicar bidirecionalmente com o filho 2.
Obrigado pela sua ajuda antecipadamente