Pregunta

En el espacio de usuario Linux, tengo un proceso de bloqueo en un semáforo, tal como lo encontró strace. Una vez que se produce la condición de error, el bloqueo es repetible, por lo que debe haber otro proceso que contenga el semáforo y no lo libere.

¿Hay alguna manera de saber qué otro proceso tiene actualmente el semáforo?

ipcs enumera el semáforo, al igual que / proc / sysvipc / sem. ¿Dónde puedo encontrar información sobre el proceso de retención?

¿Fue útil?

Solución

Los semáforos no son mutexes. Usted no '' mantiene '' ellos. Si el proceso está bloqueado, eso significa que está esperando que alguien más haga un "arriba". o "V" operación en el futuro. No existe una herramienta de kernel que le diga cuál será el comportamiento futuro del software.

Otros consejos

Puede haber una manera más fácil, pero puede usar la llamada semctl () con el cmd GETPID. Eso debería devolver el proceso que ejecutó la última llamada semop () para el semáforo. Este puede o no ser su proceso deshonesto, pero probablemente sea una buena pista.

Para encontrar los pids asociados con la lista de matrices de semáforos enumeradas por ipcs -s , puede ejecutar esto:

for pid in $( for semid in $( sudo ipcs -s | awk '/0x/{ print $2 }' ); do sudo ipcs -s -i $semid | tail -2 | head -1 | awk '{print $5}'; done | sort -u ); do ps uh -p $pid; done

" ipcs -p " no puede mostrar los semáforos de la retención del proceso, eso debe ser un error o es un límite porque es difícil de mostrar. Tienes que consultar por ti mismo.

  1. ejecute " ipcs -s " para obtener todo semid
  2. para cada semid run " ipcs -s -i "
  3. para cada semnum, para obtener el propietario pid, si el propietario pid lo desea, muestre el semid y semnum actuales.

Nota: si el proceso solo lee semáforos, es posible que no pueda obtener dicha información mediante el comando ipcs.

¿Intentaste

ipcs -p
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top