The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
определить запущен ли процесс, !*! apels1n, 28-Ноя-04, 16:09  [смотреть все]
Имеется pid процесса, название программы с этим пидом. Надо узнать программно работает ли программа еще или нет, запущен процесс или нет. В результате хочется чего-то вроде waitpid, только чтоб не только для дочерних процессов работал, а для любых.
  • определить запущен ли процесс, !*! 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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру