当前位置:  技术问答>linux和unix

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

    来源: 互联网  发布时间:2017-03-12

    本文导语:  申请临时的消息队列后,如果程序不是正常退出,消息队列则会留在内核中,并一直累加. 当消息队列数大于配置支持的最大数时,则会出错.我如何才能清除掉那些无效了的消息队列(非手动)? 如:int Key = ms...

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

如:int Key = msgget(IPC_PRIVATE, IPC_CREAT|00666);
msgctl(__Key, IPC_RMID, NULL); 

|
可以用ipcrm彻底删除:
ipcrm `ipcs |grep username| grep "^m" |awk '{print "-m " $2}'`
ipcrm `ipcs |grep username|grep "^s" |awk '{print "-s " $2}'`

|
不要用ipc_private参数,用正常的ftok, 加msgget可以避免。
另外一种不可靠的方式是在进程退出前主动去msgctl加ipc_rmid去删除自己创建的消息队列

|
你可以用shell写一段脚本做查询及删除操作。
然后用system调用该脚本.

|
可以把你用msgget创建出来的key_t都记录起来(可以是记录到文件中,但是最好是记录到其它机器重启后清空的东东里面,比如一个已知key的消息队列,或者共享内存等),下次程序启动之后检查这些key,然后逐个删除。这样也避免了删除别人创建的消息队列

|
程序为什么会不正常退出呢?
程序不正常退出通常是因为有些信号的动作
用信号处理函数来抓取信号
当异常信号出现的时候捕获,然后跳到信号处理函数那里释放申请的消息队列,再exit进程
进程的退出都是因为信号的作用的
例如你发kill 这就是向进程发SIGKILL信号
如果发生段错误进程终止,也是因为向进程发了SIGSEGV信号的原因

相关问题请阅读Linux环境高级编程。

|


正常开发程序必须要做信号处理的,这属于默认的规范了,我这有一个信号的处理函数,是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是你自定义的处理逻辑

|
对于IPC_PRIVATE方式创建的消息队列,每次msgget()应该都是一个新的key值

除非知道当时创建时返回的key,否则没有办法再次获取。
或者,可以通过ipcs命令查看,然后ipcrm删除

|
在程序中检查此key的attach值,如果为0则调用msgctl 将其删除即可。

|
拿分走人~~~~~~~~~(~ o ~)~zZ

|
拿分走人~~~~~~~~~(~ o ~)~zZ

|
拿分走人~~~~~~~~~(

|
先看看·····

|

|
来拿分的 ……

|
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
返回:若成功则为0,出错则为-1
cmd参数指定对于由msqid规定的队列要执行的命令:
•IPC_STAT取此队列的msqid_ds结构,并将其存放在buf指向的结构中。
•IPC_SET按由buf指向的结构中的值,设置与此队列相关的结构中的下列四个字段:
msg_perm.uid、msg_perm.gid、msg_perm;mode和msg_qbytes。此命令只能由下列两种进程执
行:一种是其有效用户ID等于msg_perm.cuid或msg_perm.uid;另一种是具有超级用户特权的进
程。只有超级用户才能增加msg_qbytes的值
•IPC_RMID从系统中删除该消息队列以及仍在该队列上的所有数据。这种删除立即生效。
仍在使用这一消息队列的其他进程在它们下一次试图对此队列进行操作时,将出错返回
EIDRM。此命令只能由下列两种进程执行:一种是其有效用户ID等于msg_perm.cuid或
msg_perm.uid;另一种是具有超级用户特权的进程。
这三条命令(IPC_STAT、IPC_SET和IPC_RMID)也可用于信号量和共享存储。

|
用IPC_RMID

|
我的建议, 不使用, unix域套接字, 帮你解决各种IPC难题

|
pure JF

|
拿分走人~~~

|
个人觉得直接调system就OK了

|
我现在也遇到这样的问题,问一下,当产生消息队列的进程退出后,接收消息的进程没有接收完的消息队列中的消息会不会出现与传输的不一致?

    
 
 

您可能感兴趣的文章:

  • C++ Double Ended Queues(双向队列) 成员 erase():删除一个元素
  • 删除消息队列问题?
  • 高分相赠:如何在UNIX的配置文件中,关闭或删除SCSI设备? iis7站长之家
  • 删除消息队列的进程需要什么权限
  • C++ Queues(队列) 成员 pop():删除第一个元素
  • C++ Double Ended Queues(双向队列) 成员 clear():删除所有元素
  • C++ Double Ended Queues(双向队列) 成员 pop_back():删除尾部的元素
  • C++ Double Ended Queues(双向队列) 成员 pop_front():删除头部的元素
  • C++ stl队列Queue用法介绍:删除,插入等操作代码举例
  • 高分求助实例!!!!定期删除文件!!!!!
  • 高分求助!!!!定期删除文件!!!!!
  • 请问用JavaMail如何删除某一特定邮件?高分相送!
  • 高分请教:请问怎么才能得到最近所有有关文件操作(新建,删除等)的记录
  • 高分相赠:如何在UNIX的配置文件中,关闭或删除SCSI设备?
  • 怎么才能删除红旗liunux的登陆界面(高分求助)
  • 高分求助:linux下这样的文件怎么删除?
  • 大家快来救救我,我不小心把分区删除了,高分再线等待.......
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ Maps 成员 erase():删除一个元素
  • 怎么实现,动态的增加和删除input,删除时用radiobox选中,然后点删除,即可。谢谢
  • C++ MultiMaps 成员 erase():删除元素
  • 100分相送,怎么实现,动态的增加和删除input,删除时用radiobox选中,然后点删除,即可
  • C++ Lists(链表) 成员 erase():删除一个元素
  • 请问:linux中的软件包安装后,怎么删除呀,直接删除吗?
  • C++ Lists(链表) 成员 remove():从list删除元素
  • jquery删除提示框(弹出是否删除对话框)
  • C++ Lists(链表) 成员 unique():删除list中重复的元素
  • vim删除命令"d3e"为什么删除单词的数目不一致?
  • C++ Lists(链表) 成员 pop_front():删除第一个元素
  • 如何删除前面有个-的文件,我的根目录下有个文件叫 -C,请问如何删除?
  • C++ MultiMaps 成员 clear():删除所有元素
  • jquery删除提示框弹出是否删除对话框
  • C++ Lists(链表) 成员 clear():删除所有元素
  • GRUB的删除与逻辑驱动器存在时扩展分区的删除
  • C++ Lists(链表) 成员 remove_if():按指定条件删除元素
  • fedora 删除软件,但是不删除依赖软件
  • C++ Maps 成员 clear():删除所有元素
  • linux 变量内容删除 中有关“最短数据删除”的意思
  • C++ Lists(链表) 成员 pop_back():删除最后一个元素
  • sql server 删除表1某些数据的同时自动删除表2的相关数据的sql代码


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3