代码之家  ›  专栏  ›  技术社区  ›  Halo

不同的Linux消息队列具有相同的id?

  •  4
  • Halo  · 技术社区  · 15 年前

    服务器文件如下所示:

    void server(char* req_mq) {
    struct mq_attr attr;
    mqd_t mqdes;
    struct request* msgptr;
    
    int n;
    char *bufptr;
    int buflen;
    pid_t apid;
    
    //attr.mq_maxmsg = 300;
    //attr.mq_msgsize = 1024;
    
    mqdes = mq_open(req_mq, O_RDWR | O_CREAT, 0666, NULL);
    if (mqdes == -1) {
        perror("can not create msg queue\n");
        exit(1);
    }
    printf("server mq created, mq id = %d\n", (int) mqdes);
    

    void client(char* req_mq, int min, int max, char* dir_path_name, char* outfile) {
    
    pid_t pid;
    
    /* get the process id */
    if ((pid = getpid()) < 0) {
        perror("unable to get client pid");
    }
    
    mqd_t mqd, dq;
    
    char pfx[50] = DQ_PRFX;
    char suffix[50]; //
    sprintf(suffix, "%d", pid);
    strcat(pfx, suffix);
    
    dq = mq_open(pfx, O_RDWR | O_CREAT, 0666, NULL);
    if (dq == -1) {
        perror("can not open data queue\n");
        exit(1);
    }
    printf("data queue created, mq id = %d\n", (int) dq);
    
    mqd = mq_open(req_mq, O_RDWR);
    if (mqd == -1) {
        perror("can not open msg queue\n");
        exit(1);
    }
    

    MQDE和dq似乎共享相同的ID3。

    3 回复  |  直到 15 年前
        1
  •  0
  •   erasmus    15 年前

    可能您没有关闭第一个消息队列。因为在这种情况下,操作系统会给新的操作系统提供相同的id(索引)。

        2
  •  3
  •   PP.    15 年前

    将句柄视为数组索引。操作系统保存的数组的索引,系统中的每个进程都有一个索引。

    当您打开句柄(无论是文件、消息队列、套接字等)时,操作系统会将该对象的设置记录在一个对您的进程来说是唯一的数组中。然后,操作系统将该数组的索引返回给程序。

    每次程序使用这个“句柄”时,操作系统实际上只是在私有数组中查找一个结构,它一直在寻找如何处理与这个“句柄”相关的对象。

    顺便说一下,您不需要知道或关心句柄实际包含的内容。理论上它可以是任何东西-一个幻数,一个指针,一个整数,这无关紧要。句柄实际上是一个秘密令牌,您可以随时将它交给操作系统来访问系统对象。

        3
  •  0
  •   Community CDub    8 年前

    mq_open(3) . 返回的消息队列描述符 mq\ U打开(3) mq_overview(7) 3 在打开消息队列时,您会看到两个进程得到消息(在最典型的情况下,0、1、2已经被打开以提供 STDIN STDOUT ,和 STDERR 喜欢 PP.