Имеется pid процесса, название программы с этим пидом. Надо узнать программно работает ли программа еще или нет, запущен процесс или нет. В результате хочется чего-то вроде waitpid, только чтоб не только для дочерних процессов работал, а для любых.
>Имеется 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);
}
Способ классический. Правда, как и следовало ожидать,
без возможности дождаться завершения процесса.В своё время я долго пыжился, пытаясь изготовить оный
"waitpid() для недочернего процесса". Увы, приближения
получаются в лучшем случае посредственные. Типа приведённого
выше кода цикле и совместно с nanosleep(). В итоге пришёл
к выводу, что сделать 'совсем хорошо' не дают ограничения
портабельного набора системных вызовов. Хотя возможно,
что починки требуют мои /dev/handsN.
>Способ классический. Правда, как и следовало ожидать,
>без возможности дождаться завершения процесса.
>
>В своё время я долго пыжился, пытаясь изготовить оный
>"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