msgrcv(msgid, (void*)&stMsgNodeCtr, sizeof(ST_MSG_NODE_CTR)-sizeof(long), msgtype, 0)
时间: 2024-05-28 22:12:58 浏览: 65
这是一个在 Linux 环境下使用 System V IPC 消息队列的函数调用。它的作用是从消息队列中接收消息,并将消息存储在 stMsgNodeCtr 变量所指向的内存地址中。其中,msgid 是消息队列的标识符,msgtype 是消息类型,通常为正整数,0 表示接收队列中的第一条消息。sizeof(ST_MSG_NODE_CTR)-sizeof(long) 是消息的有效数据长度,因为每个消息队列消息都包含一个长整型的消息类型,所以需要将其从消息总长度中减去。
相关问题
In function ‘main’: oo.c:19:17: warning: implicit declaration of function ‘msgget’ [-Wimplicit-function-declaration] 19 | msgid = msgget(MSG_KEY, IPC_CREAT | 0666);//创建消息队列 | ^~~~~~ oo.c:26:9: warning: implicit declaration of function ‘msgsnd’ [-Wimplicit-function-declaration] 26 | msgsnd(msgid, &msg, sizeof(msg.choice) + sizeof(msg.pid), 0); | ^~~~~~ oo.c:28:9: warning: implicit declaration of function ‘msgrcv’ [-Wimplicit-function-declaration] 28 | msgrcv(msgid, &msg1, sizeof(msg1.choice) + sizeof(msg1.pid), 1, 0); // 接收玩家1的出拳信息 | ^~~~~~
这些警告是由于在代码中使用了未声明的函数而导致的。你需要在代码开头添加头文件来声明这些函数。对于这些警告,你需要添加以下头文件:
```c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
```
这些头文件声明了在代码中使用的函数,包括 `msgget`、`msgsnd` 和 `msgrcv`。添加这些头文件可以解决这些警告。
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/msg.h> #include <errno.h> #define MAX_TEXT 512 struct msg_st { int msg_type; char text[MAX_TEXT]; }; int main() { int running = 1; struct msg_st data; struct msg_st rcvbuf; char buffer[BUFSIZ]; int msgid = -1; long int msgtype = 0; msgid = msgget((key_t)1234, 0666 | IPC_CREAT); if(msgid == -1) long int msgtype = 0; msgid = msgget((key_t)1234, 0666 | IPC_CREAT); if(msgid == -1) { fprintf(stderr, "msgget failed with error: %d\n", errno); exit(EXIT_FAILURE); } while(running) { printf("Enter some text: "); fgets(buffer, BUFSIZ, stdin); data.msg_type = 1; strcpy(data.text, buffer); if(msgsnd(msgid, (void*)&data, MAX_TEXT, 0)== -1) { fprintf(stderr, "msgsnd failed with errno: %d\n", errno); exit(EXIT_FAILURE); } memset(rcvbuf.text,0,MAX_TEXT); size_t len= msgrcv(msgid, (void*)&rcvbuf, BUFSIZ, msgtype, 0) ; if(len) printf("You wrote: %s\n",rcvbuf.text); if(len) { if(strcmp(buffer,rcvbuf.text)==0) printf("same\n"); else printf("defrent\n"); } if(strncmp(buffer, "quit", 3)== 0) { running = 0; msgctl(msgid, IPC_RMID, 0); } sleep(1); } exit(EXIT_SUCCESS); }
这段代码实现了一个简单的消息队列程序,其主要功能是向消息队列中发送消息,然后从消息队列中读取并输出相应的消息。具体流程如下:
1. 使用msgget()函数创建一个消息队列,如果消息队列已经存在则直接获取该消息队列标识符。
2. 进入一个while循环,等待用户输入消息。用户输入的消息通过fgets()函数读取到buffer缓冲区中。
3. 将消息通过msgsnd()函数发送到消息队列中。在这里,msg_type被设置为1,表示这是一条普通消息。
4. 使用msgrcv()函数从消息队列中读取消息,并将消息内容存储在rcvbuf结构体中。读取的消息类型被设置为msgtype,这里msgtype被设置为0,表示接收所有类型的消息。
5. 使用printf()函数输出读取到的消息。
6. 如果读取到的消息内容与发送的消息内容相同,则输出“same”,否则输出“defrent”。
7. 如果用户输入的消息内容为“quit”,则退出程序,并使用msgctl()函数删除该消息队列。
需要注意的是,该程序中使用了系统消息队列机制,因此需要保证发送方和接收方都能够访问同一个消息队列。消息队列的创建和删除需要使用msgget()和msgctl()函数,具体实现方法可以参考相关的Linux系统编程资料。
阅读全文