sockets - Los procesos colgados se reanudan si están conectados a strace
linux-kernel gdb (1)
Tengo un programa de red escrito en C usando sockets TCP. A veces, el programa cliente se cuelga para siempre esperando la entrada del servidor. Específicamente, el cliente se cuelga en el conjunto de llamadas select () en un archivo fd destinado a leer caracteres enviados por el servidor.
Estoy usando strace para saber dónde se estancó el proceso. Sin embargo, a veces, cuando adjunto el proceso del cliente colgado al strace, inmediatamente se reanuda su ejecución y sale correctamente. No todos los procesos bloqueados muestran este comportamiento, algunos procesos se quedan encerrados en select () incluso si los adjunto a strace. Pero la mayoría de los procesos reanudan su ejecución cuando están conectados a strace.
Tengo curiosidad por saber qué causa los procesos que se reanudan cuando se adjuntan a strace. Puede darme pistas para saber por qué los procesos de los clientes se bloquean.
¿Algunas ideas? ¿Qué causa que un proceso suspendido reanude su ejecución cuando se adjunta a strace?
Actualizar:
Aquí está la salida de strace on hung procesos.
> sudo strace -p 25645
Process 25645 attached - interrupt to quit
--- SIGSTOP (Stopped (signal)) @ 0 (0) ---
--- SIGSTOP (Stopped (signal)) @ 0 (0) ---
[ Process PID=25645 runs in 32 bit mode. ]
select(6, [3 5], NULL, NULL, NULL) = 2 (in [3 5])
read(5, "/0", 8192) = 1
write(2, "", 0) = 0
read(3, "====Setup set_oldtempbehaio"..., 8192) = 555
write(1, "====Setup set_oldtempbehaio"..., 555) = 555
select(6, [3 5], NULL, NULL, NULL) = 2 (in [3 5])
read(5, "", 8192) = 0
read(3, "", 8192) = 0
close(5) = 0
kill(25652, SIGKILL) = 0
exit_group(0) = ?
Process 25645 detached
_
> sudo strace -p 14462
Process 14462 attached - interrupt to quit
[ Process PID=14462 runs in 32 bit mode. ]
read(0, 0xff85fdbc, 8192) = -1 EIO (Input/output error)
shutdown(3, 1 /* send */) = 0
exit_group(0) = ?
_
> sudo strace -p 7517
Process 7517 attached - interrupt to quit
--- SIGSTOP (Stopped (signal)) @ 0 (0) ---
--- SIGSTOP (Stopped (signal)) @ 0 (0) ---
[ Process PID=7517 runs in 32 bit mode. ]
connect(3, {sa_family=AF_INET, sin_port=htons(300), sin_addr=inet_addr("100.64.220.98")}, 16) = -1 ETIMEDOUT (Connection timed out)
close(3) = 0
dup(2) = 3
fcntl64(3, F_GETFL) = 0x1 (flags O_WRONLY)
close(3) = 0
write(2, "dsd13: Connection timed out/n", 30) = 30
write(2, "Error code : 110/n", 17) = 17
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
exit_group(1) = ?
Process 7517 detached
No solo seleccione (), pero los procesos (del mismo programa) están bloqueados en varias llamadas al sistema antes de adjuntarlos a strace. De repente se reanudan después de unirse a strace. Si no los adjunto a strace, simplemente se quedan allí para siempre.
Actualización 2:
Aprendí que strace podría iniciar un proceso que se detuvo previamente (proceso en T iesta). Ahora trato de entender por qué estos procesos pasan al estado ''T'', cuál es la causa. Aquí está la información de estado / proc //:
> cat /proc/12554/status
Name: someone
State: T (stopped)
SleepAVG: 88%
Tgid: 12554
Pid: 12554
PPid: 9754
TracerPid: 0
Uid: 5000 5000 5000 5000
Gid: 48986 48986 48986 48986
FDSize: 256
Groups: 9149 48986
VmPeak: 1992 kB
VmSize: 1964 kB
VmLck: 0 kB
VmHWM: 608 kB
VmRSS: 608 kB
VmData: 156 kB
VmStk: 20 kB
VmExe: 16 kB
VmLib: 1744 kB
VmPTE: 20 kB
Threads: 1
SigQ: 54/73728
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000006
SigCgt: 0000000000004000
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
Cpus_allowed: 00000000,00000000,00000000,0000000f
Mems_allowed: 00000000,00000001
strace
usa ptrace
. La página man de ptrace tiene esto:
Since attaching sends SIGSTOP and the tracer usually suppresses it,
this may cause a stray EINTR return from the currently executing system
call in the tracee, as described in the "Signal injection and
suppression" section.
¿Estás viendo select
devolver EINTR
?