URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3653
[ Назад ]

Исходное сообщение
"определить запущен ли процесс"

Отправлено apels1n , 28-Ноя-04 16:09 
Имеется pid процесса, название программы с этим пидом. Надо узнать программно работает ли программа еще или нет, запущен процесс или нет. В результате хочется чего-то вроде waitpid, только чтоб не только для дочерних процессов работал, а для любых.

Содержание

Сообщения в этом обсуждении
"определить запущен ли процесс"
Отправлено Alexander S. Salieff , 29-Ноя-04 12:25 
>Имеется pid процесса, название программы с этим пидом. Надо узнать программно работает
>ли программа еще или нет, запущен процесс или нет. В результате
>хочется чего-то вроде waitpid, только чтоб не только для дочерних процессов
>работал, а для любых.


#include <sys/types.h>
#include <signal.h>
#include <errno.h>
#include <string.h>

if (kill(pid_val, 0)!=0)
{
if (errno==ESRCH) printf("Нету процесса с PID=%d\n", pid_val);
else ("Error in kill() : %s\n", strerror(errno));
}
else
{
printf("Процесс с PID=%d существует\n", pid_val);
}


"определить запущен ли процесс"
Отправлено DeadMustdie , 30-Ноя-04 22:39 
Способ классический. Правда, как и следовало ожидать,
без возможности дождаться завершения процесса.

В своё время я долго пыжился, пытаясь изготовить оный
"waitpid() для недочернего процесса". Увы, приближения
получаются в лучшем случае посредственные. Типа приведённого
выше кода цикле и совместно с nanosleep(). В итоге пришёл
к выводу, что сделать 'совсем хорошо' не дают ограничения
портабельного набора системных вызовов. Хотя возможно,
что починки требуют мои /dev/handsN.


"определить запущен ли процесс"
Отправлено klalafuda , 01-Дек-04 09:31 
>Способ классический. Правда, как и следовало ожидать,
>без возможности дождаться завершения процесса.
>
>В своё время я долго пыжился, пытаясь изготовить оный
>"waitpid() для недочернего процесса". Увы, приближения
>получаются в лучшем случае посредственные. Типа приведённого
>выше кода цикле и совместно с nanosleep(). В итоге пришёл
>к выводу, что сделать 'совсем хорошо' не дают ограничения
>портабельного набора системных вызовов. Хотя возможно,
>что починки требуют мои /dev/handsN.

в силу архитектурных особенностей, на уровне POSIX вы не получите "waitpid для любого процесса". и это логично.

если за рамками POSIX, то это уже system dependant.

например, в QNX4 микроядро может рассылать сообщение _SYSMSG_SUBTYPE_DEATH заданным процессам по завершению любого процесса в системе. фактически, полная трассировка остановки процессов. этим удобно пользоваться, когда вам нужно сделать какой-то cleanup на стороне сервера по завершению клиента, пусть даже аварийному по SIGKILL. недостаток такого подхода - чистый deadloop если процесс, подписанный на указанное сообщение зависает. тут всем хана :)

скорее всего, свои подходы есть и в Linux/BSD. не скажу про Linux, но в BSD в контексте ядра можно поставить hook на fork()/exit() -> можно нарисовать lkm под свои задачи ну и так далее. но это опять таки system dependant.

// wbr