消息类型与发送的消息类型不同 - 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()
。一切都应该在 RTS
和 OTS
消息之后发生(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);
}
其中:
who
是一个字符串,我用它来识别调用函数的Thread/Client;
queques
是一个包含 OTS
、 RTS
和 Message
queques 的数组。
我没有更多的想法。你知道原因吗?提前谢谢你。
实际上,错误隐藏在其他地方。
在我的程序的makefile中,我忘记添加关键字-pthread
进行编译;在 Mac 平台上,GCC 可能使用不同的库编译程序。
无论如何感谢您的支持<3
我正在为考试学习操作系统基础知识,但遇到了一个奇怪的问题。
我目前正在研究 send/receive 函数。
假设我有 3 个主程序客户端,这要感谢 msgsnd()
原语发送消息。结构如下:
typedef struct{
long msg_typ; //Required
int msg[2]; //2 random numbers
} message;
然后我有 2 个线程应该捕获客户端发送的消息,感谢 msgrcv()
。一切都应该在 RTS
和 OTS
消息之后发生(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);
}
其中:
who
是一个字符串,我用它来识别调用函数的Thread/Client;queques
是一个包含OTS
、RTS
和Message
queques 的数组。
我没有更多的想法。你知道原因吗?提前谢谢你。
实际上,错误隐藏在其他地方。
在我的程序的makefile中,我忘记添加关键字-pthread
进行编译;在 Mac 平台上,GCC 可能使用不同的库编译程序。
无论如何感谢您的支持<3