应用程序退出后,信号量仍保持打开状态

我有一个用C语言编写的第三方应用程序用于Linux平台.应用程序使用以下代码创建信号量:

union semun {
    int Value;
    struct semid_ds *Buffer;
    unsigned short * Array;
} Arg;

Arg.Value = 0;

SemId = semget(IPC_PRIVATE , ONE_SEMAPHORE, 0666 | IPC_CREAT);

semctl(SemId, 0, SETVAL, Arg);

当应用程序退出时,应用程序使用以下代码删除这些信号量:

semctl(SemId, 0, IPC_RMID);

如果应用程序异常停止(例如通过发送多个SIGINT信号),这些信号量将保持打开状态.使用以下命令可以看到这些信号量是开放的:

ipcs -s

必须使用ipcrm命令手动从系统中删除这些信号量.

当应用程序最终退出时,如何确保应用程序创建的信号量被删除?我已经读过exit()调用关闭所有打开的命名信号量.但是这些不是命名信号量.

我提前感谢你的帮助.

解决方法:

为了处理异常终端,我们可以安装信号处理程序

/* signal handlers available in signal.h */
#include <signal.h>

void SignalHandler(int iSignalNum)
{
    switch(iSignalNum)
    {
    case SIGINT:
    case SIGSEGV:
    case SIGTSTP:
        {
           /* Add Stuffs if necessary */
           semctl(SemId, 0, IPC_RMID);
        }
     break;
     default:
        break;
    }
   exit(0); 
}        


int main()
{
        ....

        /* Register the signal handlers */
        signal(SIGINT,  SignalHandler);
        signal(SIGSEGV, SignalHandler);
        signal(SIGTSTP, SignalHandler);
        .....
}
上一篇:使用java信号量解决读者/写作者


下一篇:POSIX信号量:为什么父进程会在子进程发布之前获取信号量?