gpt4 book ai didi

c - 消息队列。 msgsend msgrcv。 C 语言中的 System V IPC 系统调用 (Linux)

转载 作者:行者123 更新时间:2023-11-30 18:09:42 25 4
gpt4 key购买 nike

嗨,我正在使用一些共享内存,其中不同的进程读取和写入数据。我使用消息队列来存储数据在读取和写入操作之间发生更改时的消息。

/* struct that defines a message */
struct msgbuf{
long mtype; /* must be positive */
int childId; //ID of child sending message
int bufferChanged; //Buffer at which value was changed
int beforeValue; //Value before child sleeps
int afterValue; //Value after child sleeps
};

因此,在读写和检查更改时,进程按以下方式存储消息

struct msgbuf msg = {BUFFER_CHANGED, id, position, read, bufferArr[position]};
if(msgsnd(msqid, &msg, sizeof(msg), 0)== -1){
perror("msgsnd in read.write");
}

这工作正常。哦,顺便说一句,这是我创建消息队列的方法。

#define BUFFER_CHANGED 1

qKey = ftok("./", 'A');

msqid = msgget(qKey, (IPC_CREAT | 0666));

/*Perform the following if the call is unsuccessful.*/
if(msqid == -1){
printf ("\nThe msgget call failed, error number = %d\n", errno);
}
/*Return the msqid upon successful completion.*/
else{
printf ("\nMessage queue successful. The msqid = %d\n", msqid);
//exit(0);
}

所以我的问题是我不太确定如何从队列中检索消息并将其显示在屏幕上。我一直在阅读 msgrcv() 系统调用,但我不太清楚。

rc = msgrcv(msqid, &msg, sizeof(msg), BUFFER_CHANGED, IPC_NOWAIT);

rc 是一个 int,因为 msgrcv() 返回一个 int。如何将此 int 指向实际消息?如何读取消息内容并显示它们?我假设这应该在某种循环中完成。

最佳答案

返回值是一个int,因为它告诉您它读入消息缓冲区的数据量 - 在您的情况下,您希望看到4 * sizeof(int)回来查看完整消息。如果 rc 返回为 -1,则表示出现错误。如果rc返回为正数,则至少msg的某些字段将包含收到的消息数据。

查看 man page了解更多详情。

关于c - 消息队列。 msgsend msgrcv。 C 语言中的 System V IPC 系统调用 (Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1678450/

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