社区
Linux/Unix社区
帖子详情
如何 删除所有的消息队列 (高分)
qq277541717
2010-09-08 04:17:06
加精
申请临时的消息队列后,如果程序不是正常退出,消息队列则会留在内核中,并一直累加.
当消息队列数大于配置支持的最大数时,则会出错.我如何才能清除掉那些无效了的消息队列(非手动)?
如:int Key = msgget(IPC_PRIVATE, IPC_CREAT|00666);
msgctl(__Key, IPC_RMID, NULL);
...全文
8293
88
打赏
收藏
如何 删除所有的消息队列 (高分)
申请临时的消息队列后,如果程序不是正常退出,消息队列则会留在内核中,并一直累加. 当消息队列数大于配置支持的最大数时,则会出错.我如何才能清除掉那些无效了的消息队列(非手动)? 如:int Key = msgget(IPC_PRIVATE, IPC_CREAT|00666); msgctl(__Key, IPC_RMID, NULL);
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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 进程退出绝对回收不太懂。因为进展在段错误异常退出时,无法跟踪到临时创建的信息。
猫已经找不回了
2010-09-21
打赏
举报
回复
我一般是用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
专注挖煤二十年
2010-09-19
打赏
举报
回复
学习。。。。。。。。。。
macklau
2010-09-19
打赏
举报
回复
学习了
tata050
2010-09-19
打赏
举报
回复
灌水————
加载更多回复(68)
消息队列
的
删除
#include"sys/types.h" #include"sys/msg.h" #include"signal.h" #include"unistd.h" #include"stdio.h" #include"stdlib.h" int main() { int msgid; msgid=msgget(IPC_PRIVATE,0777); if(msgid <0) { pri...
linux下Posix
消息队列
的创建和
删除
原文地址:http://blog.chinaunix.net/uid-24774106-id-3033607.html 前段时间学习线程读写锁,找资料就找到了STEVENS老爷子的UNP2,虽然对UNP2 仰慕已久,始终没有买来一读,总是看电子书。本周买了本UNP2 IPC,开始看下。 对system V的
消息队列
,有一定的了解,但是对于POSIX的
消息队列
,并不熟悉
消息队列
的创建和
删除
1、
消息队列
提供了一个从一个进程向另外一个进程发送一块数据的方法2、每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值3、
消息队列
与管道不同的是,
消息队列
是基于消息的,而管道是基于字节流的,且
消息队列
的读取不一定是先入先出。4、
消息队列
也有管道一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个
消息队列
的总的字节数是有上限的int msgget(key_t key, int msgflg); //创建或打开
消息队列
, 参数: key:和
消息队列
关联的key值 msgflg
RTX5 |
消息队列
05 - 获取剩余空间,清空
消息队列
,
删除
消息队列
文章目录一、前言二、实验目的三、API3.1、osMessageQueueGetSpace3.2、osMessageQueueReset3.3、osMessageQueueDelete四、代码4.1、main.h4.2、stm32f1xxit.c4.3、main.c五、Event Recorder调试5.1、长按按钮KEY0,获取
消息队列
的剩余空间5.2、长按按钮KEY1,清空
消息队列
。长按按钮KEY2,
删除
消息队列
。 一、前言 继续学习
消息队列
的API函数。 获取剩余空间osMessageQueueGe
消息队列
(创建
消息队列
,如何发送消息,接收消息,
删除
消息队列
)
创建
消息队列
,如何发送消息,接收消息,
删除
消息队列
Linux/Unix社区
23,223
社区成员
74,536
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章