- 论坛徽章:
- 0
|
#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’) 的类型不完全
*/
|
|