Linux中用C的msgget()不使用IPC_EXCL也返回EEXIST错误

宪霖 2015-04-14 12:40:54
Linux中用C的msgget()只使用IPC_CREAT也返回EEXIST错误,网上都说不使用IPC_EXCL,光使用IPC_CREAT会返回msgid或创建一个新的队列,不会返回EEXIST,
但是,在我的程序里面,并!没!有!
求助大神们帮我看看怎么回事的!
我是在centos6.5中运行的,用的GCC编译
这个是运行的结果:


代码贴出来:
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>

void msg_show_attr(int msg_id, struct msqid_ds msg_info){

int ret = -1;
sleep(1);
ret = msgctl(msg_id, IPC_STAT, &msg_info);

if(ret == -1){
printf("failed to get msg info!\n");
return;
}

printf("--------now print info:---------\n");
printf("队列中字节数:%ld\n", msg_info.msg_cbytes);
printf("队列中消息数:%d\n", (int)msg_info.msg_qnum);
printf("队列中最大字节数:%d\n", (int)msg_info.msg_qbytes);
printf("最后发送(接收)消息的进程:%d(%d)\n", msg_info.msg_lspid, msg_info.msg_lrpid);
printf("最后发送(接收)消息的时间:%s(%s)\n", ctime(&(msg_info.msg_stime)), ctime(&(msg_info.msg_rtime)));
printf("最后变化的时间:%s\n", ctime(&(msg_info.msg_ctime)));
printf("消息UID=%d, GID=%d\n", msg_info.msg_perm.uid, msg_info.msg_perm.gid);

}

int main(){

int ret = -1;
int msg_flags, msg_id;
key_t key;
struct msgmbuf{
int mtype;
char mtext[10];
};

struct msgmbuf msg_mbuf;
struct msqid_ds msg_info;

int msg_sflags, msg_rflags;
char *msgpath = "/ipc/msg";

//键值构建函数,获取IPC键值。
key = ftok(msgpath, 'c');
if(key == -1){
printf("ftok failed: %d!\n", errno);
return -1;
}

printf("ftok succeed: %d!\n", key);
//msgget()用来创建或者获取消息队列,
msg_flags = 0;
msg_flags |= IPC_CREAT;
msg_flags |= IPC_EXCL;
msg_id = msgget(key, msg_flags|0x0666);
printf("msg flag is %d\nmsgget return: %d\n", msg_flags, msg_id);
if(msg_id == -1){
printf("msgget failed: %s!\n", strerror(errno));
return -1;
}
printf("msgget succeed: %d!\n", msg_id);
msg_show_attr(msg_id, msg_info);

//开始发送消息
//并且此处设置为了IPC_NOWAIT,因此不会等待消息发送成功!即为异步执行!
msg_sflags = IPC_NOWAIT;
msg_mbuf.mtype = 10;
memcpy(msg_mbuf.mtext, "测试消息", sizeof("测试消息"));
ret = msgsnd(msg_id, &msg_mbuf, sizeof("测试消息"), msg_sflags);
if(ret == -1){
printf("msgsnd failed!\n");
}else{
printf("msgsnd succeed!\n");
}
msg_show_attr(msg_id, msg_info);

//开始接收消息
struct msgmbuf msgmbuf_r;
msg_rflags = IPC_NOWAIT|MSG_NOERROR;
ret = msgrcv(msg_id, &msgmbuf_r, 10, 10, msg_rflags);//成功返回接收的数据长度
if(ret == -1){
printf("msgrcv failed: %d!\n", errno);
}else{
printf("msgrcv succeed, msg length: %d.\n", ret);
}
msg_show_attr(msg_id, msg_info);




return 0;

}
...全文
557 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhxianbin 2015-04-14
  • 打赏
  • 举报
回复
IPC_CREAT 和 IPC_EXCL 都有时可能出现这个错误
宪霖 2015-04-14
  • 打赏
  • 举报
回复
我复制的时候,代码上是有msg_flags != IPC_EXCL,但是就算我删掉,也还是会提示EEXIST错误,
宪霖 2015-04-14
  • 打赏
  • 举报
回复
2楼的意思我没看明白呢?
zhxianbin 2015-04-14
  • 打赏
  • 举报
回复
EEXIST A  message  queue  identifier  exists  for  the  argument  key but ((msgflg & IPC_CREAT) && (msgflg &
              IPC_EXCL)) is non-zero.
你的 msg_flags |= IPC_CREAT; msg_flags |= IPC_EXCL;
宪霖 2015-04-14
  • 打赏
  • 举报
回复
我知道怎么回事儿的了,,msg_id = msgget(key, msg_flags|0x0666); 应该是 msg_id = msgget(key, msg_flags|0666);
宪霖 2015-04-14
  • 打赏
  • 举报
回复
而且这样下面又会出现 Permission denied的错误
宪霖 2015-04-14
  • 打赏
  • 举报
回复
!!!!!真的成功了!但是不知道为什么。。。
zhxianbin 2015-04-14
  • 打赏
  • 举报
回复
msg_id = msgget(key, msg_flags|0x0666); 改成 msg_id = msgget(key, msg_flags);
宪霖 2015-04-14
  • 打赏
  • 举报
回复
能不能帮我看看 为什么会出现这样的错误,却没有返回正常的msgid?
zhxianbin 2015-04-14
  • 打赏
  • 举报
回复
man 手册上只是说 这种情况下会返回 EEXIST 错误
宪霖 2015-04-14
  • 打赏
  • 举报
回复
那只使用IPC_CREAT出现这种错误有可能是什么情况呢~~~?郁闷死了 弄了很久都弄不出来。。。

23,125

社区成员

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

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