读书笔记:第6章 System V消息队列 (1)

《UNIX网络编程:卷2》P107:图6-3

--------------------------------------------

创建一个消息队列,往该队列中放置一个含有1字节数据的消息,发出msgctl的IPC_STAT命令,使用system函数执行ipcs命令,最后使用msgclt的IPC_RMID命令删除该队列。

/*
 * ctl.c
 * P107 图6-3 使用msgctl命令的例子
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/msg.h>
#include <sys/ipc.h>

#define MSG_R	0400
#define MSG_W	0200
#define SVMSG_MODE	(MSG_R | MSG_W | MSG_R>>3 | MSG_R>>6)

struct msgbuf {
	long	mtype;		// 消息类型
	char	mtext[1];	// 消息数据
};

int main(int argc, char *argv[])
{
	int				msqid;
	struct msqid_ds	info;
	struct msgbuf	buf;

	// 创建一个新的消息队列 
	if ((msqid = msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT)) < 0) {
		fprintf(stderr, "msgget error: %s\n", strerror(errno));
		exit(1);
	}

	buf.mtype =1;
	buf.mtext[0] = 1;
	// 放置一个消息到队列中
	if (msgsnd(msqid, &buf, 1, 0) < 0) {
		fprintf(stderr, "msqid error: %s\n", strerror(errno));
		exit(1);
	}

	// 获取消息队列的信息
	if (msgctl(msqid, IPC_STAT, &info) < 0) {
		fprintf(stderr, "msgctl error:%s\n", strerror(errno));
		exit(1);
	}

	printf("read-write: %03o, ctypes = %lu, qnum = %lu, qbytes = %lu\n",
			info.msg_perm.mode & 0777, info.msg_cbytes,
			info.msg_qnum, info.msg_qbytes);

	system("ipcs -q");			// 执行ipcs命令

	// 删除指定消息队列
	msgctl(msqid, IPC_RMID, NULL);

	exit(0);
}

运行程序:

$ ./ctl 
read-write: 644, ctypes = 1, qnum = 1, qbytes = 16384

--------- 消息队列 -----------
键        msqid      拥有者  权限     已用字节数 消息      
0x00000000 0          user      644        1            1

0是IPC_PRIVATE键的共同键值。执行本程序的系统上每个消息队列有16384字节的限制。

你可能感兴趣的:(读书笔记,《UNIX网络编程》)