Hi!
Очевидно, что произвольный процесс может "навечно" заблокироваться
на выполнении системного вызова при определенных условиях.
Простейшие примеры - read, select, epoll_wait, futex.
Возникла очень просто формулируемая задача, простое решение которой
в голову не приходит.
Имеем процесс с определенным PID'ом.
Требуется определить, висит ли данный процесс на каком-либо системном
вызове или нет.
Критерием зависания будем считать выполнение системного вызова более
некоторого таймаута (например T=30 секунд).
Таким образом, если процесс закончил выполнение хотя бы одного
системного вызова, то считаем, что он не висит.
Если же за время наблюдения T процесс так и не завершил выполнение
системного вызова, то считаем, что он висит.
Понятное дело, что процесс может вообще не выполнять никаких системных
вызовов долгое время (например при долгих вычислениях).
Также очевидно, что процесс может получить сигнал, обработать его и
перезапустить системный вызов, обнаружив EINTR.
Все это можно игнорировать.
Есть идеи как решить данную проблему?
P.S.
Все решения, приходящие в голову, так или иначе построены вокруг
strace и ее реализации.
Мне они не очень нравятся, но если альтернатив не будет, придется
использовать.