0

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

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

然后我有 2 个线程应该捕获客户端发送的消息,感谢msgrcv(). 一切都应该在消息之后发生RTSOTSOK TO SEND,READY TO SEND)。发送应该是同步的。当一个线程接收到 RTS 消息时,它应该只从发送者客户端接收。这使我将message字段设置msg_typ为 Client Pid,并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是一个包含 和 queques的OTS数组。RTSMessage

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

4

1 回答 1

0

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

于 2019-12-02T14:38:55.683 回答