У меня возникли некоторые затруднения с выяснением, как именно работает функция 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" Получено »никогда не печатается на протяжении всего исполнения. Есть ли что-то, что вы можете сказать, очевидно, неправильно с тем, как я обрабатываю сигналы?
Редактировать: я исправил свою проблему! К сожалению, это не имело ничего общего с тем, что я имею выше, поэтому я прошу прощения за людей, которые найдут этот вопрос в будущем, ища ответ.
В любом случае, если вы наткнетесь на него, возможно, это связано с тем, как вы блокируете сигналы. Я неправильно заблокировал сигналы в родительском процессе, поэтому они перешли в дочерние процессы. Если у вас возникла эта проблема, возможно, проверьте, как вы заблокировали сигналы.