我有一个用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()调用关闭所有打开的命名信号量。但是这些并没有命名为信号量。
我事先感谢你的帮助。
答案 0 :(得分:3)
您可能希望使用atexit()
注册应用程序定义的退出处理程序。
void myexit(void)
{
semctl(SemId, 0, IPC_RMID);
}
...
int main()
{
atexit(myexit); /* register exit handler */
...
有关atexit()
的详细信息,请参阅man atexit
。
答案 1 :(得分:3)
为了处理异常终止,我们可以安装信号处理器
/* 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);
.....
}