c语言消息队列 私聊 代码
时间: 2023-11-03 12:55:31 浏览: 82
下面是一个简单的 C 语言代码示例,演示了如何使用消息队列来进行私聊:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/msg.h>
#include <sys/types.h>
// 定义消息结构体
struct message {
long type; // 消息类型
char text[100]; // 消息正文
};
int main() {
int qid;
pid_t pid;
struct message msg;
// 创建一个消息队列
qid = msgget(IPC_PRIVATE, 0666);
// 创建一个子进程
pid = fork();
if (pid == -1) {
perror("fork");
exit(1);
} else if (pid == 0) {
// 子进程接收消息
while (1) {
msgrcv(qid, &msg, sizeof(msg.text), getpid(), 0);
printf("Received message: %s\n", msg.text);
}
} else {
// 父进程发送消息
while (1) {
printf("Enter message: ");
fgets(msg.text, sizeof(msg.text), stdin);
msg.text[strlen(msg.text) - 1] = '\0'; // 去掉换行符
msg.type = pid; // 消息类型为子进程的进程 ID
msgsnd(qid, &msg, strlen(msg.text) + 1, 0);
}
}
return 0;
}
```
这段代码中,我们使用 `msgget()` 函数创建了一个消息队列,并使用 `fork()` 函数创建了一个子进程。父进程负责从标准输入读取消息并发送到消息队列中,子进程负责接收消息并输出到控制台中。
在发送消息时,我们使用了子进程的进程 ID 作为消息类型,以保证只有子进程能够接收到该消息。在接收消息时,我们使用 `msgrcv()` 函数指定了消息类型为当前进程的进程 ID,从而只接收到针对自己的消息。
需要注意的是,这段代码并没有进行任何错误处理和边界检查,仅用于演示消息队列的基本使用方法。在实际使用中,应该对输入的消息长度和消息队列的容量进行限制,避免出现缓冲区溢出等问题。
阅读全文