0

メッセージの送受信に 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 に参加できません。これには理由がありますか?

4

2 に答える 2

0

間違いを見つけました。それ以外の

sprintf(bufT.mtext, "%d\n", client[temp].mqID);

そのはず

sprintf(bufT.mtext, "%d\n", keyT);

キーの代わりに MQID を使用して MQ を結合しようとしました。

于 2013-04-08T17:20:00.657 に答える
0

ファイル名が指定され、ファイルが存在するはずなのに存在しない場合、またはパス名のディレクトリのいずれかが存在しない場合、そのようなファイルまたはディレクトリのエラーは発生しません。key がどのオブジェクトも参照せず、IPC_CREAT フラグが設定されていない場合に、msgget() で発生します。

于 2013-04-06T20:37:23.387 に答える