我很难弄清楚在子进程中使用kill(pid_t pid, int sig)
函数的工作方式。在我的程序中,我有一个父级,以及用fork()
创建的8个子进程。我一直在网上搜索和阅读,但无济于事。所有搜索到的有关杀死父进程中的子进程的结果。
我在每个进程中都设置了信号处理程序,但它们不能正常工作。
基本上,我需要从子进程“ signal_generating_process”中发出进程组中的所有进程的信号,但是由于某些原因,信号无法正确通过。
在手册页上,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);
}
}
当这些循环通过时,在整个执行过程中绝不会打印“收到信号1”。您能告诉我的任何明显与我处理信号方式有关的错误吗?
编辑:我解决了我的问题!不幸的是,这与我上面没有任何关系,因此对于以后发现此问题并寻求答案的人们,我深表歉意。
无论如何,如果您偶然发现它,也许它与阻止信号的方式有关。我在父进程中错误地阻止了信号,因此它们转移到了子进程中。如果您遇到此问题,请检查您如何阻止信号。