免费注册 查看新帖 |

Chinaunix

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

[C] 新手信息队列编译问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-01 15:44 |只看该作者 |倒序浏览
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
void msg_stat(int,struct msgid_ds msg_info);

int main(){
int gflags,sflags,rflags;     //flags位
key_t key;                        //ftok获取的键值
int msgid;                        //创建的消息队列的ID
int reval;   
struct msgsbuf{
  int mtype;                //类型
  char mtext[1];                //data
}msg_sbuf;
struct msgrbuf{
  int mtype;
  char mtext[1];
}msg_rbuf;
struct msgid_ds msg_ginfo,msg_sinfo;        //get 和 set msgid_ds的键值
char* msgpath;
key=ftok(msgpath,'a');
gflags=IPC_CREAT | IPC_EXCL;
msgid=msgget(key,gflags | 00666);
if(msgid==-1){
  printf("msgid_ds create failed!\n");
  return;
}
msg_stat(msgid,msg_ginfo);
sflags=IPC_NOWAIT;
msg_sbuf.mtype=10;
msg_sbuf.mtext[0]='a';
reval=msgsnd(msgid,&msg_sbuf,sizeof(msg_sbuf.mtext),sflags);
if(reval==-1){
  printf("msgsnd failed!\n");
  return;
}
msg_stat(msgid,msg_ginfo);
rflags=IPC_NOWAIT | MSG_NOERROR;
reval=msgrcv(msgid,&msg_rbuf,4,10,rflags);
if(reval==-1){
  printf("msgrcv failed!\n");
  return;
}
printf("read from msg queue %d bytes ; content='%s'\n",reval,msg_rbuf.mtext);
msg_stat(msgid,msg_ginfo);
msg_sinfo.msg_perm.uid=8;
msg_sinfo.msg_perm.gid=8;
msg_sinfo.msg_qbytes=16388;
reval=msgctl(msgid,IPC_SET,&msg_sinfo);
if(reval==-1){
  printf("msgctl IPC_SET failed!\n");
  return;
}
if((reval=msgctl(msgid,IPC_RMID,NULL))==-1){
  printf("Unlink msg queue failed!\n");
  return;
}
return 0;
}
void msg_stat(int msgid,struct msgid_ds msg_info){
int reval;
sleep(1);
if((reval=msgctl(msgid,IPC_STAT,&msg_info))==-1){
  printf("get msg info error!\n");
  return;
}
printf("\n");
printf("current number of bytes on queue is %d \n",msg_info.msg_cbytes);
printf("number of messages in queue is %d \n",msg_info.msg_qnum);
printf("max number of bytes on queue is %d \n",msg_info.msg_qbytes);
printf("pid of last msgsnd is %d \n",msg_info.msg_lspid);
printf("pid of last msgrcv is %d \n",msg_info.msg_lrpid);
printf("last msgsnd time is %s \n",ctime(&(msg_info.msg_stime)));
printf("last msgrcv time is %s \n",ctime(&(msg_info.msg_rtime)));
printf("last change time is %s \n",ctime(&(msg_info.msg_ctime)));
printf("msg uid is %d\n",msg_info.msg_perm.uid);
printf("msg gid is %d\n",msg_info.msg_perm.gid);

}
/*

[root@localhost c]# gcc -g -o t1 t1.c
t1.c:6: 警告:‘struct msgid_ds’在形参表内部声明
t1.c:6: 警告:它的作用域仅限于此定义或声明,这可能并不是您想要的
t1.c: 在函数‘main’中:
t1.c:21: 错误:‘msg_ginfo’的存储大小未知
t1.c:21: 错误:‘msg_sinfo’的存储大小未知
t1.c:30: 错误:实参 2 的类型不完全
t1.c:39: 错误:实参 2 的类型不完全
t1.c:47: 错误:实参 2 的类型不完全
t1.c: 在文件层:
t1.c:62: 警告:‘struct msgid_ds’在形参表内部声明
t1.c:62: 错误:形参 2 (‘msg_info’) 的类型不完全



*/



论坛徽章:
0
2 [报告]
发表于 2013-04-01 16:52 |只看该作者
struct msqid_ds
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP