当前位置: 技术问答>linux和unix
删除消息队列问题?
来源: 互联网 发布时间:2015-01-21
本文导语: 最近写一个用消息队列实现进程间通信的程序,服务端程序是一个死循环,不断读消息队列看是否不请求发出.问题是我每次强行退出此进程后,这个消息队列不是还留在系统中吗?有那位大侠怎么样将这个消息队列给删除...
最近写一个用消息队列实现进程间通信的程序,服务端程序是一个死循环,不断读消息队列看是否不请求发出.问题是我每次强行退出此进程后,这个消息队列不是还留在系统中吗?有那位大侠怎么样将这个消息队列给删除掉(在程序退出的时候),先谢了
|
signal(SIGINT,remove_queue);
void remove_queue(int qid)
{
/* Remove the queue */
msgctl(qid, IPC_RMID, 0);
}
不好意思,借花献佛:)
void remove_queue(int qid)
{
/* Remove the queue */
msgctl(qid, IPC_RMID, 0);
}
不好意思,借花献佛:)
|
"
signal(SIGINT,remove_queue);
void remove_queue(int qid)
{
/* Remove the queue */
msgctl(qid, IPC_RMID, 0);
}
"
上文错误,上文中qid == SIGINT。
而msgctl(qid, IPC_RMID, 0);中的qid应该是你要删除的消息队列的ID。
而且我觉得要捕捉的信号不仅仅是SIGINT,还应该有别的信号,得看你将以什么方式退出了,但是捕捉SIGTERM信号是很保险的。
signal(SIGINT,remove_queue);
void remove_queue(int qid)
{
/* Remove the queue */
msgctl(qid, IPC_RMID, 0);
}
"
上文错误,上文中qid == SIGINT。
而msgctl(qid, IPC_RMID, 0);中的qid应该是你要删除的消息队列的ID。
而且我觉得要捕捉的信号不仅仅是SIGINT,还应该有别的信号,得看你将以什么方式退出了,但是捕捉SIGTERM信号是很保险的。
|
void remove_queue(int qid)
{
/* Remove the queue */
msgctl(qid, IPC_RMID, 0);
}
函数msctl,在退出来时,讲消息队列清除。
{
/* Remove the queue */
msgctl(qid, IPC_RMID, 0);
}
函数msctl,在退出来时,讲消息队列清除。
|
死循环前;
不要忘了#include
不要忘了#include
|
楼上说的对!
|
你是怎么强行退出的?
如果你是ctrl+C或者delete强行退出的,你可以在SIGINT信号的句柄函数中删除该消息队列然后退出。
如果你是ctrl+C或者delete强行退出的,你可以在SIGINT信号的句柄函数中删除该消息队列然后退出。
|
signal(SIGINT,remove_queue);
放在程序的死循环前就行了。表示收到SIGINT信号后执行remove_queue函数。
放在程序的死循环前就行了。表示收到SIGINT信号后执行remove_queue函数。
|
signal(SIGINT,remove_queue);
放在循环之前任何地方都可以
放在循环之前任何地方都可以