消息类型与发送的消息类型不同 - msgsnd/msgrcv C

Message Type is different from the one sent - msgsnd/msgrcv C

我正在为考试学习操作系统基础知识,但遇到了一个奇怪的问题。 我目前正在研究 send/receive 函数。 假设我有 3 个主程序客户端,这要感谢 msgsnd() 原语发送消息。结构如下:

typedef struct{
    long msg_typ; //Required
    int msg[2]; //2 random numbers
} message;

然后我有 2 个线程应该捕获客户端发送的消息,感谢 msgrcv()。一切都应该在 RTSOTS 消息之后发生(OK TO SEND,READY TO SEND)。发送应该是同步的。当线程收到 RTS 消息时,它应该只从 发送方客户端 接收。这使我将 message 字段 msg_typ 设置为 Client Pid,并使用以下原型调用 msgrcv() 函数:

msgrcv(queques[2], &mrts, sizeof(message)-sizeof(long), 0, 0);

假设queque是RTS queque的id,msg_typ参数设置0为了接收queque的第一条消息,那么感谢message字段msg_typ线程恢复客户端的PID。

但是,在运行时,message 字段 msg_typ 与发送的字段不同,即使我确定该线程实际上收到了相同的消息:

Client n. 4761: Seding RTS Message. PID: 4761.
...
Thread n. 1 of Server pid 4763: RTS Message received. PID: 1806. Sending OTS Message. //The pid is different!
Thread n. 0 of Server pid 4763: OTS Message sent. PID: 1806. Receiving Message.

为了更好地理解,这些是我使用的过程:

void send_sync(message* m, int* queques, char* who){
    message mots, mrts;
    int pid = getpid();
    mrts.msg_typ = pid;
    printf("%s: Sending of RTS Message. PID: %ld.\n", who, mrts.msg_typ);
    msgsnd(queques[2], &mrts, sizeof(message)-sizeof(long), 0);
    printf("%s: RTS Message sent. PID: %ld. Waiting for OTS Message.\n", who, mrts.msg_typ);
    msgrcv(queques[1], &mots, sizeof(message)-sizeof(long), pid, 0);
    printf("%s: OTS Message received. PID: %ld. Sending Message. \n", who, mots.msg_typ);
    m -> msg_typ = pid;
    msgsnd(queques[0], m, sizeof(message)-sizeof(long), 0);
    printf("%s: Message sent. PID: %d.", who, pid);
}

void rcv_sync_f(message* m, int* queques, char* who){
    message mots, mrts;
    printf("%s: Receiving RTS Message. PID: NOT SET YET.\n", who);
    msgrcv(queques[2], &mrts, sizeof(message)-sizeof(long), 0, 0);
    printf("%d\n", queques[2]);
    printf("%s: RTS Message received. PID: %ld. Sending OTS Message.\n", who, mrts.msg_typ);
    mots.msg_typ = mrts.msg_typ;
    msgsnd(queques[1], &mots, sizeof(message)-sizeof(long), 0);
    printf("%s: OTS Message sent. PID: %ld. Receiving Message.\n", who, mots.msg_typ);
    msgrcv(queques[0], m, sizeof(message)-sizeof(long), mots.msg_typ, 0);
    printf("%s: Message ricevuto. PID: %ld.", who, m -> msg_typ);
}

其中:

我没有更多的想法。你知道原因吗?提前谢谢你。

实际上,错误隐藏在其他地方。 在我的程序的makefile中,我忘记添加关键字-pthread进行编译;在 Mac 平台上,GCC 可能使用不同的库编译程序。 无论如何感谢您的支持<3