①使用系统调用msgget(),msgsnd(),msgrcv(),及msgctl()等编制一个长度为1k的消息的发送和接收程序。 ②观察程序,说明控制消息队列系统调用
时间: 2023-11-13 12:03:28 浏览: 167
下面是一个使用上述系统调用编写的消息队列发送和接收程序的示例:
发送程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MAX_MSG_SIZE 1024
struct msg_buffer {
long msg_type;
char msg_text[MAX_MSG_SIZE];
};
int main() {
key_t key = ftok(".", 'a'); // 生成一个key
int msg_id = msgget(key, IPC_CREAT | 0666); // 创建或打开消息队列
if (msg_id == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
struct msg_buffer msg;
msg.msg_type = 1;
printf("Enter a message to send: ");
fgets(msg.msg_text, MAX_MSG_SIZE, stdin); // 从标准输入读取消息内容
if (msgsnd(msg_id, &msg, sizeof(msg.msg_text), 0) == -1) { // 发送消息
perror("msgsnd");
exit(EXIT_FAILURE);
}
printf("Message sent successfully!\n");
return 0;
}
```
接收程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MAX_MSG_SIZE 1024
struct msg_buffer {
long msg_type;
char msg_text[MAX_MSG_SIZE];
};
int main() {
key_t key = ftok(".", 'a'); // 使用同样的key获取消息队列
int msg_id = msgget(key, IPC_CREAT | 0666); // 创建或打开消息队列
if (msg_id == -1) {
perror("msgget");
exit(EXIT_FAILURE);
}
struct msg_buffer msg;
if (msgrcv(msg_id, &msg, sizeof(msg.msg_text), 1, 0) == -1) { // 接收消息
perror("msgrcv");
exit(EXIT_FAILURE);
}
printf("Received message: %s", msg.msg_text);
return 0;
}
```
这两个程序可以在不同的终端窗口中分别启动。发送程序会提示用户输入一条消息,然后将该消息发送到消息队列中;接收程序会从消息队列中接收一条消息并显示在终端上。
控制消息队列的系统调用包括:
- msgget:创建或打开一个消息队列。
- msgsnd:向消息队列发送一条消息。
- msgrcv:从消息队列接收一条消息。
- msgctl:控制消息队列的属性,如删除消息队列等。
这些系统调用都需要使用 key_t 类型的 key 来标识消息队列。key 可以使用 ftok 函数生成,也可以手动指定。在使用 msgget 函数创建消息队列时,需要指定标志参数,比如 IPC_CREAT 表示创建新队列,IPC_EXCL 表示如果队列已经存在则返回错误。在使用 msgsnd 函数发送消息时,需要指定消息类型、消息内容和消息长度。在使用 msgrcv 函数接收消息时,需要指定要接收的消息类型和接收缓冲区的大小。在使用 msgctl 函数控制消息队列时,需要指定要控制的队列标识符和要执行的操作,比如删除队列、修改队列属性等。
阅读全文