www.pudn.com > pthread_examples.rar > msgqueue.c


#include  
#include  
#include  
#include  
 
void msg_stat(int, struct msqid_ds ); 
 
main() 
{ 
	int gflags, sflags, rflags; 
	key_t key; 
	int msgid; 
	int reval; 
	 
	struct msgsbuf 
	{ 
        int mtype; 
        char mtext[1]; 
    }msg_sbuf; 
	 
	struct msgmbuf 
    { 
	    int mtype; 
	    char mtext[10]; 
    }msg_rbuf; 
	 
	struct msqid_ds msg_ginfo, msg_sinfo; 
	char* msgpath="/home/share/jinbq/pthread_examples/msgqueue/key"; 
	 
	key = ftok(msgpath, 'a'); 
	 
	gflags = IPC_CREAT|IPC_EXCL;  // 
	msgid = msgget(key, gflags|00666); 
	if(errno == EEXIST) 
	{ 
		printf("msgqueue id is already exist!\n"); 
	} 
	if(msgid == -1) 
	{ 
	    printf("msg create error\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("message send error\n"); 
	} 
	/*发送一个消息后,输出消息队列属性*/ 
	msg_stat(msgid, msg_ginfo); 
	 
	rflags = IPC_NOWAIT | MSG_NOERROR; 
	/*从消息队列中接收一个消息,无等待且截取方式*/ 
	reval = msgrcv(msgid, &msg_rbuf, 4, 10, rflags); 
	if(reval == -1) 
	    printf("read msg error\n"); 
	else 
	    printf("read from msg queue %d bytes\n", reval); 
	//从消息队列中读出消息后,输出消息队列属性 
	msg_stat(msgid, msg_ginfo); 
	 
	msg_sinfo.msg_perm.uid = 8;//just a try 
	msg_sinfo.msg_perm.gid = 8;// 
	msg_sinfo.msg_qbytes   = 16388; 
	/*此处验证超级用户可以更改消息队列的缺省msg_qbytes*/ 
	/*注意这里设置的值大于缺省值*/ 
	/*设置消息队列的属性*/ 
	reval = msgctl(msgid, IPC_SET, &msg_sinfo); 
	if(reval == -1) 
	{ 
	    printf("msg set info error\n"); 
	    return; 
	} 
	msg_stat(msgid, msg_ginfo); 
	//验证设置消息队列属性*/ 
	reval = msgctl(msgid, IPC_RMID, NULL);/*删除消息队列*/ 
	if(reval == -1) 
	{ 
	    printf("unlink msg queue error\n"); 
	    return; 
	} 
} 
void msg_stat(int msgid, struct msqid_ds msg_info) 
{ 
	int reval; 
	sleep(1);/*只是为了后面输出时间的方便*/ 
	reval = msgctl(msgid, IPC_STAT, &msg_info); 
	if(reval == -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); 
	/*每个消息队列的容量(字节数)都有限制MSGMNB,值的大小因系统而异。在创建新的消息队列时,*/ 
	/*msg_qbytes的缺省值就是MSGMNB*/ 
	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", ctime(&(msg_info.msg_stime))); 
	printf("last msgrcv time is %s", ctime(&(msg_info.msg_rtime))); 
	printf("last change time is %s", 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); 
}