質問

IPCキューを介して、お互いからメッセージを送信および受信する2つのプログラムがあります。ただし、MSGRCV関数は、キューから実際に送信されたものを受信する代わりに、空白のメッセージを取得する場合があります。私は動作するはずだと思う修正をコメントしましたが、ここで確認して、これがMSGRCVとMSGSNDを使用する適切な方法であるかどうかを確認したいと思いました。

MSGRCV:

int readqueue(int qid, long type, char *msg)
{
    int retval;

    // Current fix for blank messages
    /* strcpy(MsgQueue.Message, "");

    while (strcmp(MsgQueue.Message, "") == 0)
    {
        retval = msgrcv(qid, &MsgQueue, MSGSIZE, (long)type, 0);

        if (strcmp(MsgQueue.Message, "") == 0)
            printf("msgrcv fail\n");
    }*/

    retval = msgrcv(qid, &MsgQueue, MSGSIZE, (long)type, 0);
    strcpy(msg, MsgQueue.Message);

    return retval;
}



msgsnd:

int sendqueue(int qid, long type, char *msg)
{
    struct msqid_ds stat_buf, *pstat_buf;
    int av, retval;

    pstat_buf = &stat_buf;
    av = 0;

    /* Make sure there's space in the queue */
    do 
    {                
        retval = msgctl( qid, IPC_STAT, pstat_buf);
        if (retval == -1) 
        {
            fprintf(stderr, "msgctl in sendqueue failed!  Error = %d\n", errno);
            return retval;
        }
    } while ( pstat_buf->msg_qbytes - pstat_buf->msg_cbytes == 0);

    strcpy(MsgQueue.Message, msg);
    MsgQueue.MsgType = (long)type;

    retval = msgsnd(qid, &MsgQueue, MSGSIZE, 0);

    memset(MsgQueue.Message, '\0', MSGSIZE-1);
    return retval;
}
役に立ちましたか?

解決

あなたは言う: 「ただし、MSGRCV関数は、キューから実際に送信されたものを受信する代わりに空白のメッセージを取得することがあります」

私はあなたの問題をデバッグする方法として実際に何が起こっているのかを理解することを提案します。

msgrcv 読み取られたバイト数を返すか -1 エラー時に...それをチェックして、実際に何が起こっているのかを確認する必要があります。

-1の場合、 errno 設定され、それがあなたに伝えることができる多くのことがあります。 Man Pageにはすべてがリストされています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top