Question

J'ai deux programmes qui envoient et reçoivent des messages dans les deux sens via des files d'attente IPC. Cependant, parfois la fonction MRGRCV recevra un message vierge au lieu de recevoir ce qui a été réellement envoyé par la file d'attente. J'ai commenté un correctif qui, je pense, devrait fonctionner, mais je voulais vérifier ici et voir si c'est la bonne façon d'utiliser MgrCV et MSGSND.

mgrcv:

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;
}
Était-ce utile?

La solution

Vous dites: "Cependant, parfois la fonction MRGRCV recevra un message vierge au lieu de recevoir ce qui a été réellement envoyé par la file d'attente"

Je suggère de découvrir ce qui se passe réellement comme moyen de déboguer votre problème.

msgrcv va retourner le nombre d'octets lus ou -1 Sur l'erreur ... vous devriez vérifier cela et voir ce qui se passe réellement.

Si c'est -1, errno est réglé et il y a un certain nombre de choses qu'il peut vous dire. La page de l'homme les répertorie tous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top