waitpid возвращает 0, когда SIGINT (Crtl+c) на дочернем

Я работаю в терминале для университетской работы, но у меня проблемы с поиском готовых детей.

У меня есть список, в котором я сохраняю фоновые процессы, и это работает нормально, но когда я вывожу его на передний план и посылаю ему сигнал SIGINT с помощью ctrl+c, waitpid возвращает 1 для всех незавершенных детей, кроме того, который я убиваю. Это мой код. Я уверен, что моя ошибка в этом waitpid, но я не знаю, почему возвращает неправильное значение. Что я хочу, чтобы мой код делал, так это выбирал, когда я убиваю процесс с помощью SIGINT, и убиваю этот, и удаляю его из списка, но сохраняю незавершенные команды.

int emptyBackground(List *list){ 

    ListNode *aux = list->first;
    ListNode *aux2 = NULL; 

    while(aux != NULL){
        if(waitpid(aux->pid, NULL, WNOHANG) > 0){ // This waitpid returns a non expected value
            if(aux2 != NULL){
                aux2->next = aux->next;
                free(aux);
                aux = aux2->next;
            }else{
                list->first = aux->next;
                free(aux);
                aux = list->first;
            }
        }else{
            aux2 = aux;
            aux = aux->next;
        }
    }
    return 0;
}

ПД: В моем списке есть команда pid, команда и указатель на следующий узел.


person jesus elvira    schedule 07.12.2017    source источник
comment
Код, который вы показываете, не записывает значение, возвращаемое waitpid(), и вы игнорируете информацию о статусе выхода. Если бы я отлаживал его, я бы собирал и печатал или регистрировал оба бита информации.   -  person Jonathan Leffler    schedule 07.12.2017


Ответы (1)


waitpid никогда не должен возвращать 1. Он должен вернуть -1, 0 или pid дочернего элемента, который вышел. Попробуйте использовать поле wstatus в waitpid, чтобы отладить именно то, что, по мнению waitpid, произошло с дочерним элементом.

person Gabriel Marks    schedule 07.12.2017
comment
... и pid 1 - это изначальный процесс, традиционно init; он никогда не является потомком другого процесса. - person John Bollinger; 07.12.2017