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

《UNIX网络编程:卷2》P111:图6-8

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

要访问一个System V消息队列,调用msgget并不是必须的,我们只需要知道该消息队列的标识符,并拥有该队列的读权限。

/*
 * msgrcvid.c
 * P111 图6-8 只知道标识符时从一个System V消息队列中读
 */
#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)

#define MAXMSG  (8192 + sizeof(long))

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

int main(int argc, char *argv[])
{
    int             mqid;
    ssize_t         n;
    struct msgbuf   *buff;

    if (argc != 2) {
        fprintf(stderr, "usage: msgrcvid <mqid>\n");
        exit(1);
    }   
    mqid = atoi(argv[1]);

    // 分配缓冲区
    if ((buff = malloc(MAXMSG)) == NULL) {
        fprintf(stderr, "malloc error\n");
        exit(1);
    }   

    // 从消息队列中读取消息
    if ((n = msgrcv(mqid, buff, MAXMSG, 0, 0)) < 0) {
        fprintf(stderr, "msgrcv error: %s\n", strerror(errno));
        exit(1);
    }   

    printf("read %ld bytes, byte = %ld\n", n, buff->mtype);

    exit(0);
}

运行程序:

$ touch /tmp/testid
$ ./msgcreate /tmp/testid 
$ ./msgsnd /tmp/testid 4 400
$ ipcs -q

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

$ ./msgrcvid 0
read 4 bytes, byte = 400

我们从ipcs的输出中获得标识符为0.

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