Какой простой способ проверить, работает ли какой-либо процесс с данным идентификатором в настоящее время в Linux? - PullRequest
5 голосов
/ 05 июля 2010

В C ++ у меня есть ресурс, связанный с pid.Иногда процесс, связанный с этим pid, завершается ненормально и пропускает ресурс.

Поэтому я подумываю поместить pid в файл, в котором записывается, что ресурс используется.Затем, когда я иду, чтобы получить ресурс, если я вижу элемент, зарегистрированный как находящийся в использовании, я ищу, чтобы увидеть, запущен ли в данный момент процесс, соответствующий pid, и, если нет, очистить просочившийся ресурс.

Я понимаю, что существует очень малая вероятность того, что новый нереализованный pid теперь разделяет то же число, но это лучше, чем утечка без очистки, которую я имею сейчас.

В качестве альтернативы, возможно, есть лучшее решениедля этого, если да, предложите, в противном случае я продолжу запись pid.

Дополнительные сведения: ресурс представляет собой номер порта для связи между клиентом и сервером по протоколу tcp.Только один экземпляр клиента может использовать данный номер порта на компьютере.Номера портов взяты из диапазона доступных номеров портов для использования.Пока клиент работает, он записывает номер порта, который он использует, в специальном файле на диске, а затем очищает эту запись при выходе.При аварийном выходе это не всегда очищается, и номер порта остается аннотированным как используемый, когда он больше не используется.

Ответы [ 5 ]

4 голосов
/ 05 июля 2010

Чтобы проверить существование процесса с заданным идентификатором, используйте kill(pid,0) (я полагаю, вы находитесь в системе POSIX). Подробнее см. man 2 kill.

Кроме того, вы можете использовать waitpid вызов, чтобы получать уведомления о завершении процесса.

3 голосов
/ 05 июля 2010

Я бы порекомендовал вам использовать какой-то ресурс ОС, а не PID. Мьютексы, семафоры, удаление при закрытии файлов. Все они очищаются ОС при выходе из процесса.

В Windows я бы порекомендовал именованный мьютекс.

В Linux я бы порекомендовал использовать flock для файла.

2 голосов
/ 05 июля 2010

Как насчет главного процесса, который запускает ваш процесс (тот, который ненормально завершается), ожидает сбоя вашего процесса (waitpid) и порождает его снова, когда возвращается waitpid.

while(1) {
fork exec
waitpid
}
0 голосов
/ 05 июля 2010

API, который достигает этого в окнах: OpenProcess , который принимает идентификатор процесса в качестве ввода, и GetExitCodeProcess , который возвращает STILL_ACTIVE, когда процесс, ну, все еще активен. Вы также можете использовать любую функцию Wait с нулевым тайм-аутом, но этот API выглядит несколько чище.

Однако, как отмечают другие ответы, этот путь не кажется многообещающим. Возможно, мы сможем дать более конкретный совет, если вы предоставите больше деталей сценария. Какая у тебя платформа? Что такое утечка ресурсов? У вас есть доступ к утечке кода приложения? Можете ли вы обернуть это в высокоуровневую попытку с некоторой очисткой? Если нет, то, может быть, подождать, пока ликер завершит работу с выделенным потоком (или вообще с выделенным процессом)? Любая предоставленная вами информация может помочь.

0 голосов
/ 05 июля 2010

Проблемная область не ясна, к сожалению, вы можете попытаться объяснить ее другим способом.

Но если я вас правильно понимаю, вы можете создать карту типа

std::map< ProcessId, boost::shared_ptr<Resource> > map;
// `Resource` here references to some abstract resource type
// and `ProcessId` on Windows system would be basically a DWORD

и в этом случае вам просто нужно перечислить все запущенные процессы (это можно сделать с помощью вызова EnumProcesses в Windows) и удалить каждую запись с неподходящим идентификатором из вашего map. После этого у вас останутся только допустимые пары процесс-ресурс. Это действие может повторяться каждые YY секунд в зависимости от ваших потребностей.

Обратите внимание, что в этом случае удаление элемента с вашей карты вызовет соответствующий деструктор (потому что, если ваш ресурс не используется в вашем коде где-то еще, его счетчик ссылок упадет до нуля).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...