- определить запущен ли процесс, Alexander S. Salieff, 12:25 , 29-Ноя-04 (1)
>Имеется 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, 22:39 , 30-Ноя-04 (2)
Способ классический. Правда, как и следовало ожидать, без возможности дождаться завершения процесса.В своё время я долго пыжился, пытаясь изготовить оный "waitpid() для недочернего процесса". Увы, приближения получаются в лучшем случае посредственные. Типа приведённого выше кода цикле и совместно с nanosleep(). В итоге пришёл к выводу, что сделать 'совсем хорошо' не дают ограничения портабельного набора системных вызовов. Хотя возможно, что починки требуют мои /dev/handsN.
- определить запущен ли процесс, klalafuda, 09:31 , 01-Дек-04 (3)
>Способ классический. Правда, как и следовало ожидать, >без возможности дождаться завершения процесса. > >В своё время я долго пыжился, пытаясь изготовить оный >"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
|