C msgget无法加入mq

C msgget无法加入mq,c,pthreads,posix,message-queue,C,Pthreads,Posix,Message Queue,我正在使用SysV发送/接收消息 在我的服务器类的线程函数中,我创建了密钥和MQ。这已成功完成,新MQ的mqID存储在结构msgbuf中名为mtext的char[]变量中 struct msgbuf { long mtype; char mtext[100]; }; 以下是我在服务器类的线程函数中创建mqID的方式: void *thread_function(void *arg){ int temp; //temp placement for current clie

我正在使用SysV发送/接收消息

在我的服务器类的线程函数中,我创建了密钥和MQ。这已成功完成,新MQ的mqID存储在结构msgbuf中名为mtext的char[]变量中

struct msgbuf {
    long mtype;
    char mtext[100];
};
以下是我在服务器类的线程函数中创建mqID的方式:

void *thread_function(void *arg){
    int temp; //temp placement for current client
    temp=i;
    key_t keyT;
    struct msgbuf bufT;
    keyT=ftok("mcs1.c", 'B'); //create key for client[temp]
    if ((client[temp].mqID=msgget(keyT, 0666 | IPC_CREAT))==-1){ //private mq for client[temp]
            perror("msgget");
    }
    bufT.mtype=2;   //1. SET MTYPE TO 2
    sprintf(bufT.mtext, "%d\n", client[temp].mqID);//2. SET MTEXT TO MQID OF PRIVATE MQ

    if (msgsnd(msqid, &bufT, sizeof(bufT.mtext),0)==-1) {perror("msgsnd");} //3. SEND TO CLIENT using global MQ

    ...
    }
我刚刚创建的新MQ的MQID存储在bufT中

在客户机类中,以下是我rcv MQID和创建MQ的方式:

...
if(msgrcv(msqid, &buf, sizeof(buf.mtext), 2, 0) == -1){ //RECEIVE ACK MSG
            perror("msgrcv");
    }
    else{
            printf("ack received\n");
    }
    key_t key1;
    key1=atoi(buf.mtext);
    if ((mqT=msgget(key1, 0666)) == -1){
            printf("UNABLE TO JOIN PRIVATE MQ");
                    perror("msgget");
                    printf("%d", key1);
    }
...
每当我运行服务器和客户机时,它都会显示
msgget:在运行客户机程序的终端上没有这样的文件或目录。

即使当我在客户机类中打印密钥并且该密钥是正确的密钥时,它仍然无法加入MQ。有什么原因吗?

如果指定了文件名,并且该文件应该存在但不存在,或者路径名中的某个目录不存在,则不会发生此类文件或目录错误。当key未引用任何对象且未设置IPC_CREAT标志时,msgget()会出现此错误。

发现错误。 而不是

sprintf(bufT.mtext,“%d\n”,客户端[temp].mqID)

应该是

sprintf(bufT.mtext,“%d\n”,键)


试图使用MQID而不是密钥加入MQ。

但是我使用
ipcs
来测试服务器是否创建了MQ,并且确实创建了MQ,客户端只是拒绝加入客户端和服务器端已经创建的MQAccess权限?