免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2312 | 回复: 6
打印 上一主题 下一主题

关于消息队列 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-11-28 15:22 |只看该作者 |倒序浏览
这是在Unix上执行ipcs -q命令后输出中的一行

T      ID     KEY              MODE        OWNER     GROUP
q   10247 0x00000000 -Rrw-rw-rw-         I         I

请问,我在C程序里,怎么根据ID得到MODE字段中'R'标志是否被设置.也就是说我想知道,是否有进程在指定的消息队列上调用msgrcv.
谢谢!

论坛徽章:
0
2 [报告]
发表于 2004-11-29 08:11 |只看该作者

关于消息队列

man msgctl

论坛徽章:
0
3 [报告]
发表于 2004-11-29 09:28 |只看该作者

关于消息队列

能不能说明白一些啊,我实在不知道如何判断.

论坛徽章:
0
4 [报告]
发表于 2004-11-29 10:18 |只看该作者

关于消息队列

偶刚学,照着stevens的书抄袭了一个程序:

  1.      1 #include <unistd.h>;
  2.       2 #include <string.h>;
  3.       3 #include <stdio.h>;
  4.       4 #include <sys/ipc.h>;
  5.       5 #include <sys/msg.h>;
  6.       6
  7.       7 int main(void)
  8.       8 {
  9.       9         int msqid;
  10.      10         struct msqid_ds info;
  11.      11         struct {long mtype;char mtext[48];}buf;
  12.      12
  13.      13         msqid = msgget(IPC_PRIVATE,IPC_CREAT|0600);
  14.      14
  15.      15         buf.mtype = 1;
  16.      16         buf.mtext[0] = 1;
  17.      17         msgsnd(msqid,&buf,1,0);
  18.      18
  19.      19         msgctl(msqid,IPC_STAT,&info);
  20.      20         system("ipcs -q");
  21.      21
  22.      22         msgctl(msqid,IPC_RMID,NULL);
  23.      23
  24.      24         return 0;
  25.      25 }
  26.      26
复制代码


msgctl的第二个参数有3个取值:1,IPC_STAT,取得改消息队列的信息,放在第三个参数中;2,IPC_SET,按照第三个参数的值来设定该消息队列的属性;3,IPC_RMID,删除该消息队列,这时候只要把msgctl的第三个参数填写NULL就行。

我的机器上的以上程序的输出是:
[root@localhost 20]# ./a.out

  1. ------ Message Queues --------
  2. key        msqid      owner      perms      used-bytes   messages
  3. 0x00000000 262144     root       600        1            1
复制代码


我不懂的是,msqid_ds.msg_perm.mode字段的设定是不是跟文件I/O中的mode完全一样?ipc没有执行许可位,是不是最宽松的权限就是0666了?

初学的问题,请朋友们指教……

论坛徽章:
0
5 [报告]
发表于 2004-11-29 13:31 |只看该作者

关于消息队列

原帖由 "bjf" 发表:
这是在Unix上执行ipcs -q命令后输出中的一行
我在C程序里,怎么根据ID得到MODE字段中'R'标志是否被设置.也就是说我想知道,是否有进程在指定的消息队列上调用msgrcv.


我猜你的意思,是不是要判断还有哪些别的进程在使用本消息队列?这个恐怕不可能,消息队列结构没有一个类似引用计数这样的字段,所以如果你用msgctl+IPC_RMID删除一个消息队列,别的进程引用到该消息队列的话就会出错返回。

APUE上讲的很明白,14章《进程间通信》。

论坛徽章:
0
6 [报告]
发表于 2005-02-21 17:22 |只看该作者

关于消息队列

如果你在创建的时候用了IPC_PRIVATE,而且没有fork子进程,应该其它进程没办法访问这个Q吧?
0666只是表示属主,用户组,其它组都有执行权限,这个不算最宽松的权限吧?

论坛徽章:
0
7 [报告]
发表于 2005-02-22 09:04 |只看该作者

关于消息队列

原帖由 "mafia" 发表:

0666只是表示属主,用户组,其它组都有执行权限,这个不算最宽松的权限吧?


最宽松是777,既然IPC没有执行位,那666就相当于777了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP