Как убить / сигнализировать другие дочерние процессы от другого дочернего процесса? - PullRequest
1 голос
/ 27 апреля 2020

У меня возникли некоторые затруднения с выяснением, как именно работает функция kill(pid_t pid, int sig) при использовании ее в дочернем процессе. В моей программе у меня есть родительский процесс и 8 дочерних процессов, созданных с помощью fork(). Я искал и читал онлайн безрезультатно, к сожалению. Все результаты поиска об убийстве детей из родительского процесса.

У меня установлены обработчики сигналов в каждом процессе, за исключением того, что они работают неправильно.

По сути, мне нужно передать все процессы в группе процессов из дочернего процесса "signal_generating_process", но по какой-то причине сигналы не проходят правильно.

На странице man kill (2) говорит, что если я использую 0 в качестве первого аргумента, он отправит сигнал всем процессам в группе процессов, но он не работает для меня правильно. Я включу код для генератора сигналов, а также один из обработчиков сигналов. Не стесняйтесь спрашивать дополнительную информацию, если я не включил достаточно. Спасибо всем большое!

void signal_generating_process(){
    signal(SIGINT, end_process_handler);
    block_sigusr1();
    block_sigusr2();
    while(true){
        millisleep(randomFloat(.01,.1)); //function I created to sleep for a certain amount of milliseconds
        int sig = rand_signal(); //randomly picks between sigusr1 and sigusr2
        kill(0, sig);
        if(sig == SIGUSR1){ //adds to a counter for sigusr1
            pthread_mutex_lock(&shm_ptr->mutex1_sent);
            shm_ptr->SIGUSR1_sent++;
            pthread_mutex_unlock(&shm_ptr->mutex1_sent);
        }
        else{ //signal == SIGUSR2 - adds to a counter for sigusr2
            pthread_mutex_lock(&shm_ptr->mutex2_sent);
            shm_ptr->SIGUSR2_sent++;
            pthread_mutex_unlock(&shm_ptr->mutex2_sent);
        }
    }
}

Процесс, который обрабатывает sigusr1 и обработчик сигналов (sigusr2 - то же самое):

void sigusr1_receiving_process(){
    block_sigusr2();
    signal(SIGUSR1, sigusr1_handler);
    signal(SIGINT, end_process_handler);
    while(true){
        sleep(1);
    }
}
void sigusr1_handler(int signal){
    printf("Signal 1 Received\n");
    if(signal == SIGUSR1){
        pthread_mutex_lock(&shm_ptr->mutex1_received);
        shm_ptr->SIGUSR1_received++;
        pthread_mutex_lock(&shm_ptr->mutex1_received);
    }
}

Когда эти циклы go through, "Сигнал 1" Получено »никогда не печатается на протяжении всего исполнения. Есть ли что-то, что вы можете сказать, очевидно, неправильно с тем, как я обрабатываю сигналы?

Редактировать: я исправил свою проблему! К сожалению, это не имело ничего общего с тем, что я имею выше, поэтому я прошу прощения за людей, которые найдут этот вопрос в будущем, ища ответ.

В любом случае, если вы наткнетесь на него, возможно, это связано с тем, как вы блокируете сигналы. Я неправильно заблокировал сигналы в родительском процессе, поэтому они перешли в дочерние процессы. Если у вас возникла эта проблема, возможно, проверьте, как вы заблокировали сигналы.

...