如何 删除所有的消息队列 (高分)

qq277541717 2010-09-08 04:17:06
加精
申请临时的消息队列后,如果程序不是正常退出,消息队列则会留在内核中,并一直累加.
当消息队列数大于配置支持的最大数时,则会出错.我如何才能清除掉那些无效了的消息队列(非手动)?

如:int Key = msgget(IPC_PRIVATE, IPC_CREAT|00666);
msgctl(__Key, IPC_RMID, NULL);
...全文
8171 88 打赏 收藏 转发到动态 举报
写回复
用AI写文章
88 条回复
切换为时间正序
请发表友善的回复…
发表回复
__壹零贰肆__ 2012-08-31
  • 打赏
  • 举报
回复
受教了,多谢各位啊
gdwangwei 2011-09-09
  • 打赏
  • 举报
回复
我的方法是:
signal(SIGINT,remove_queue); //用户捕获系统退出等信号量,并删除队列
void remove_queue(int qid)
{
qid = 你创建队列时的id;
/* Remove the queue */
msgctl(qid, IPC_RMID, 0);
exit(1);
}

就ok了!试试吧
shry999 2011-08-16
  • 打赏
  • 举报
回复
学习了!
钱国正 2011-04-30
  • 打赏
  • 举报
回复
ipcrm -Q keyid
JosephMu 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 cochlea2007 的回复:]
我的建议, 不使用, unix域套接字, 帮你解决各种IPC难题
[/Quote]

同感~~
我觉得最笨的方法:
其实可以程序利用ipcs把得到的消息号写到标准流里面,
然后把消息号取出来。再删除不就行了么?

另一个更笨的方法:
在你创建消息队列的时候,把消息号写到一个文件中,然后退出前处理一下这个文件就好了。

如果是core dump就谁也没办法了。
关键是你退出的有多恶劣。
editionman 2010-09-23
  • 打赏
  • 举报
回复
看看。。。
qq277541717 2010-09-22
  • 打赏
  • 举报
回复
十分感谢lantianye的相告。
hairetz 进程退出绝对回收不太懂。因为进展在段错误异常退出时,无法跟踪到临时创建的信息。
  • 打赏
  • 举报
回复
我一般是用ftok来做。
然后保证ipc的文件跟创建的ipc资源是同步存在的,如果进程退出绝对回收sem,msg等资源,那也会同步unlink掉对应ipc文件。

如果非要用脚本来善后,也很方便,因为只要不是实际新建了一个ipc资源,每次调用msgget之类的系统调用,同一个key_t必然得到相同的ipc key。所以ipcrm之即可。
gaogao110 2010-09-21
  • 打赏
  • 举报
回复
学习。。。。。。。。
yhd1074694651 2010-09-20
  • 打赏
  • 举报
回复
不懂
··················
monkey7604 2010-09-20
  • 打赏
  • 举报
回复
在程序中调用ipcs也可以呀
yhlzln 2010-09-20
  • 打赏
  • 举报
回复
学习了,感谢楼主
ce_qbliu 2010-09-20
  • 打赏
  • 举报
回复
好复杂哦
lantianye 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 58 楼 qq277541717 的回复:]

在退出程序时处理异常,把申请的临时队列删掉。这个工作量不小,且我现在还不太懂。
看来还是写一个脚本搞定。
[/Quote]

正常开发程序必须要做信号处理的,这属于默认的规范了,我这有一个信号的处理函数,是linux系统下的
void set_sig()
{
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
act.sa_handler = sig_child_exit_handler;
sigaction(SIGCHLD, &act, NULL);

sigemptyset(&act.sa_mask);
act.sa_flags = 0;
act.sa_handler = sig_exit_handler;
sigaction(SIGTERM, &act, NULL);
sigaction(SIGQUIT, &act, NULL);
sigaction(SIGILL, &act, NULL);
sigaction(SIGABRT, &act, NULL);
sigaction(SIGFPE, &act, NULL);
sigaction(SIGBUS, &act, NULL);
sigaction(SIGSEGV, &act, NULL);

}

其中sig_child_exit_handler和sig_exit_handler是你自定义的处理逻辑
wwwyzt 2010-09-20
  • 打赏
  • 举报
回复
学习了。。这个问题好!
shuangwen163 2010-09-19
  • 打赏
  • 举报
回复
正在学习
gu0120 2010-09-19
  • 打赏
  • 举报
回复
ddd
  • 打赏
  • 举报
回复
学习。。。。。。。。。。
macklau 2010-09-19
  • 打赏
  • 举报
回复
学习了
tata050 2010-09-19
  • 打赏
  • 举报
回复
灌水————
加载更多回复(68)

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧