我试图理解消息队列在我看到的例子中,msg结构只有一个属性,除了第一个属性(类型)必须是long所以,它应该类似于struct msg{long mtype; char text[100]};
我试图添加一个新的int属性,x以查看我是否同时收到了文本和数字,并且它起了作用。
消息队列应该是这样工作的吗?我可以在我的struct中拥有尽可能多的属性吗?
另外,调用长度参数设置为msgrcvmsgsndsizeof(send) - sizeof(send.x)函数可以吗,因为我知道结构的大小并不总是与每个属性的sizeof之和相同?
谢谢您。

int main(){

    struct msg{
        long mtype;
        char text[100];
        int x;
    };

    int key = ftok(".", 10);
    int qid = msgget(key, 0666|IPC_CREAT);

    int pid = fork();

    if(pid == 0){
        struct msg send;
        send.mtype = 1;
        strcpy(send.text, "hello");
        send.x = 99;
        if(msgsnd(qid, (void*)&send, sizeof(send) - sizeof(send.x), 0)<0){
             printf("Error child: ");
        }
    }
    else{
        struct msg recieve;
        if(msgrcv(qid, (void*)&recieve, sizeof(recieve) - sizeof(recieve.x), 1, 0)<0){
             perror("Error parent: ");
        };
        printf("text: %s\nnumber: %d", recieve.text, recieve.x);
    }

    return 0;
}

最佳答案

char[]只是一个占位符,您可以在所需的long mtype字段之后在结构中拥有所需的任何内容msgsnd()调用的大小不包括mtype。
你差点就答对了。
这是一个工作版本:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

int main(void){

    struct msg {
        long mtype;
        char text[100];
        int x;
    };

    size_t sz = sizeof(struct msg) - sizeof(long);  <=== /* SIZE */
    int key = ftok(".", 10);
    int qid = msgget(key, 0666|IPC_CREAT);

    int pid = fork();

    if (pid == 0){
        struct msg send;
        send.mtype = 1;
        strcpy(send.text, "hello");
        send.x = 99;
        if (msgsnd(qid, (void*)&send, sz, 0)<0){
             perror("Error child: ");
        }
    } else {
        struct msg recieve;
        if(msgrcv(qid, (void*)&recieve, sz, 1, 0)<0){
             perror("Error parent: ");
        };
        printf("text: %s\nnumber: %d\n", recieve.text, recieve.x);
    }

    return 0;
}

关于c - 这是消息队列应该如何工作的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41988823/

10-10 07:17