【发布时间】:2018-10-19 10:46:01
【问题描述】:
我有 N 个子进程和一个父进程。 我在下面的代码中有信号处理程序。
void unlink_semaphores(){
sem_unlink(SEM_NAME1) < 0;
// perror("sem_unlink(3) failed");
sem_unlink(SEM_NAME2) < 0;
//perror("sem_unlink(3) failed");
sem_unlink(SEM_NAME3) < 0;
// perror("sem_unlink(3) failed");
sem_unlink(SEM_NAME4) < 0;
// perror("sem_unlink(3) failed");
sem_unlink(SEM_NAME5) < 0;
//perror("sem_unlink(3) failed");
sem_unlink(SEM_NAME6) < 0;
//perror("sem_unlink(3) failed");
sem_unlink(SEM_NAME7) < 0;
//perror("sem_unlink(3) failed");
if (shm_unlink(SHMOBJ_PATH1) != 0) {
// perror("In shm_unlink() of buffer 1");
exit(1);
}
}
void sinyal_handler(int signo)
{
if (signo == SIGINT || signo == SIGTERM) {
if(signo == SIGINT) printf("received Ctrl+C\n");
if(signo == SIGTERM) printf("received SIGTERM \n");
printf("closing semaphores and giving shared maps...\n");
unlink_semaphores();
_exit(EXIT_FAILURE);
}
}
在分叉之前的主程序中,我设置了信号处理程序。
signal(SIGINT,&sinyal_handler);
signal(SIGTERM,&sinyal_handler);
并且子进程永远不会超出 While(1) 循环,直到 CTRL+C 进入程序并且信号处理程序通过关闭链接的信号量等将其杀死。
for (i = 0; i < PROCESS_N; i++) {
if (fork() == 0) {
// do the job specific to the child process
//random shared variable -> ra
while(1){ .. code->
问题是当我按 CTRL + C 程序多次调用信号处理程序并打印信息时,尝试多次取消链接文件。
如何解决这个问题?
【问题讨论】:
-
为什么不安排主进程在收到信号时做任何事情呢?
-
请注意,
sem_unlink()、shm_unlink()、exit()和printf()都不是异步信号安全函数,不能从信号处理程序中安全调用。根据 POSIX 标准的2.4 Signal Concepts:“任何不在上表中的函数都可能对信号不安全。......当信号中断不安全函数或等效函数......并且信号捕获函数调用不安全函数时,行为未定义。”
标签: c signals fork posix signal-handling