读书笔记:第3章 System V IPC (2)

        《UNIX网络编程:卷2》P26:图3-7 连续输出由内核赋予的消息队列标识10次

/* P26 slot.c */
#include <stdio.h>
#include <stdlib.h>
#include <sys/msg.h>
#include <errno.h>
#include <string.h>
#define MSG_R   0400
#define MSG_W   0200
#define SVMSG_MODE (MSG_R | MSG_W | MSG_R>>3 | MSG_R>>6)
int main(int argc, char *argv[])
{
    int     i, msqid;
    for (i = 0; i < 10; i++) {
        // 创建一个消息队列
        msqid = msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);
        if (msqid < 0) {
            fprintf(stderr, "msgget error: %s\n", strerror(errno));
            exit(1);
        }
        printf("msgqid = 0x%x\n", msqid);
        // 删除消息队列
        if (msgctl(msqid, IPC_RMID, NULL) < 0) {
            fprintf(stderr, "msgctl error: %s\n", strerror(errno));
        }
    }   
    exit(0);
}

        每次循环由msgget创建一个消息队列,然后由使用IPC_RMID命令的msgctl删除该队列。

        运行结果如下:

$ ./slot 
msgqid = f0000
msgqid = f8000
msgqid = 100000
msgqid = 108000
msgqid = 110000
msgqid = 118000
msgqid = 120000
msgqid = 128000
msgqid = 130000
msgqid = 138000

        如果再次运行该程序,我们就能看出槽位使用情况序列号是一个跨进程保持的内核变量。

$ ./slot 
msgqid = 0x140000
msgqid = 0x148000
msgqid = 0x150000
msgqid = 0x158000
msgqid = 0x160000
msgqid = 0x168000
msgqid = 0x170000
msgqid = 0x178000
msgqid = 0x180000
msgqid = 0x188000

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