Проблема с проверкой, запущен ли процесс или нет

#c

#c

Вопрос:

Мне требуется создавать процессы, которые разделяются на дочерние процессы, которые будут выполнять команды с использованием execv(). Родительский процесс завершится немедленно, оставив дочерний процесс для запуска нового образа. Я сохранил идентификатор дочернего процесса, и при вызове команды я проверю, запущен ли этот процесс или нет. Вот код.

 for(size_t i = 0; i < currProcess; i  ) {
        if (kill(processArr.pid, 0) != 0 amp;amp; errno == ESRCH) {
            processArr[i].run = false;
        } else {
            processArr[i].run = true;
        }
    }
  

Однако, похоже, что процессы не заканчиваются и выполняются вечно. Изображение execv () не завершает процесс по завершении? Что-то не так с кодом?

Комментарии:

1. Для меня это выглядит опасно. Например. ваш дочерний процесс мог завершиться сам по себе (сбой, сбой-убийца, выход (), ..), И ОС, возможно, переработала тот же pid для совершенно нового процесса, который вообще не имеет никакого отношения к вашему программному обеспечению; в результате чего ваше программное обеспечениепопробуйте уничтожить процессы, которые вообще не имеют никакого отношения к вашему программному обеспечению.

Ответ №1:

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

было бы неплохо получить больше информации или посмотреть на код, который выполняется выполняемым процессом, и структуру processArr .

несколько вещей, которые вы можете сделать, если уверены, что процесс должен завершиться, — это попытаться удалить проверку and errno в операторе if и посмотреть, изменит ли это результат.

это может быть связано с тем, как вы пытаетесь проверить errno, вот объяснение с справочной страницы errno:

    A common mistake is to do

       if (somecall() == -1) {
           printf("somecall() failedn");
           if (errno == ...) { ... }
       }

   where errno no longer needs to have the value it had upon return from
   somecall() (i.e., it may have been changed by the printf(3)).  If the
   value of errno should be preserved across a library call, it must be
   saved:

       if (somecall() == -1) {
           int errsv = errno;
           printf("somecall() failedn");
           if (errsv == ...) { ... }
       }
  

надеюсь, это поможет, а если нет, я был бы признателен за дополнительную информацию.