Até onde eu entendo, uma vez que uma conexão TCP é estabelecida, não há fluxo real de dados, a menos que uma das duas pontas realmente envie uma mensagem, ambas são bloqueadas em uma chamada para receber uma mensagem. Como em, não é como se uma das pontas estivesse enviando mensagens periódicas para a outra dizendo "só para você saber, eu ainda estou vivo".
Se for esse o caso, então eu esperaria que se qualquer uma das extremidades do canal de comunicação fosse desligada abruptamentekill -KILL it
(por exemplo , mas também apenas desconectasse o cabo de alimentação de toda a máquina), a outra extremidade não saberia.
Indo para um exemplo concreto, posso estabelecer uma conexão entre dois terminais via socat
:
- ouça de um terminal e anote o PID
$ socat -d4 TCP-LISTEN:12345 - $ # ctrl-z $ jobs -l [1]+ 958602 Stopped socat -d4 TCP-LISTEN:12345 - $ fg
- conecte-se do outro terminal e anote esse PID também
$ socat -d4 TCP-CONNECT:localhost:12345 - $ # ctrl-z $ jobs -l [1]+ 958730 Stopped socat -d4 TCP-CONNECT:localhost:12345 - $ fg
(Ambos socat
os comandos produzem uma quantidade considerável de saída por causa das -d4
mensagens de depuração.)
Agora, se eu abrir um terceiro terminal, finalizo o problema
$ kill -KILL 958730
Vejo Killed
sendo impresso no segundo terminal, sem mais linhas de depuração do socat
que aquelas que foram impressas antes, mas no primeiro terminal vejo mais saída:
2025/02/10 18:04:42 socat[958602] D select -> (, 0x0, 0x0, 0x0, NULL/0.000000), 1
2025/02/10 18:04:42 socat[958602] D read(122, 0x61dbb1b48000, 8192)
2025/02/10 18:04:42 socat[958602] D read -> 0
2025/02/10 18:04:42 socat[958602] N socket 1 (fd 122) is at EOF
2025/02/10 18:04:42 socat[958602] D data loop: sock1->eof=3, sock2->eof=0, closing=1, wasaction=1, total_to={0.1000000}
2025/02/10 18:04:42 socat[958602] D select(1, &0x1, &0x0, &0x0, &0.500000)
2025/02/10 18:04:43 socat[958602] D select -> (, 0x0, 0x0, 0x0, &0.000000), 0
2025/02/10 18:04:43 socat[958602] I poll timed out (no data within 0.500000 seconds)
2025/02/10 18:04:43 socat[958602] I shutdown(122, 2)
2025/02/10 18:04:43 socat[958602] D shutdown() -> 0
2025/02/10 18:04:43 socat[958602] D tcsetattr(0, 0, {00006506,00000005,000000bf,00008a3b, 15,15, 03,1c,7f,15,04,00,01,00,11,13,1a,00,12,0f,17,16,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00})
2025/02/10 18:04:43 socat[958602] D tcsetattr() -> 0
2025/02/10 18:04:43 socat[958602] D tcsetattr(1, 0, {00006506,00000005,000000bf,00008a3b, 15,15, 03,1c,7f,15,04,00,01,00,11,13,1a,00,12,0f,17,16,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00})
2025/02/10 18:04:43 socat[958602] D tcsetattr() -> 0
2025/02/10 18:04:43 socat[958602] N exiting with status 0
2025/02/10 18:04:43 socat[958602] D exit(0)
2025/02/10 18:04:43 socat[958602] D starting xioexit()
2025/02/10 18:04:43 socat[958602] D finished xioexit()
Mas eu não entendo, se SIGKILL
não pode ser capturado/manipulado no código do usuário porque é manipulado diretamente pelo kernel , então 958730
não deve haver chance de fazer algo como enviar uma mensagem dizendo "desculpe, estou morrendo" e, portanto, 958602
nunca deve saber sobre isso.
Onde está a falha no meu raciocínio?