gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:09:36 27 4
gpt4 key购买 nike

我正在为考试学习操作系统基础知识,但遇到了一个奇怪的问题。我目前正在研究发送/接收功能。假设我有 3 个主程序 Client,它们通过 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,并使用以下原型(prototype)调用 msgrcv() 函数:

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

假设queque是RTS队列的id,将msg_typ参数设置为0,以便接收该队列的第一条消息,则感谢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);
}

地点:

  • who是一个字符串,我用它来标识调用该函数的线程/客户端;
  • queques是一个包含 OTSRTSMessage 队列的数组。

我没有更多的想法了。你知道原因吗?预先感谢您。

最佳答案

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

关于c - 消息类型与发送的消息类型不同 - msgsnd/msgrcv C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59101624/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com