メッセージの送受信に SysV を使用しています。
Server クラスのスレッド関数内で、キーと MQ を作成します。これは正常に行われ、新しい MQ の mqID が struct 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 i の MQID は、bufT に格納されます。
クライアント クラスでは、MQID を rcv して 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: No such file or directory
、クライアントプログラムを実行している端末に表示されます。クライアント クラスでキーを出力し、それが正しいキーであっても、MQ に参加できません。これには理由がありますか?