linux设计一个程序实现以下功能:1.屏幕上显示功能菜单,菜单第一行为*********,菜单第二行为* 1:get a message queue ,菜单第三行为 2:sending message ,菜单第四行为* 3:receiving message ,菜单第五行为 4:remove a message queue ,菜单第六行为 0:Exit ,菜单第7行为********。2.接收用户的选择。3.根据用户的选择,创建消息队、发送消息、接收消息、撤销消息队列。4.仅当用户选择0才能结束程序的运行返回,否则继续显示功能菜单接收用户新的选择,将屏幕控制起来。请给出代码
时间: 2023-07-13 09:14:24 浏览: 206
以下是一个简单的实现,使用了ncurses库来控制终端输出和输入:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <ncurses.h>
#define MAX_MSG_SIZE 1024
typedef struct {
long type;
char text[MAX_MSG_SIZE];
} message_t;
void print_menu() {
clear();
printw("*********\n");
printw("* 1:get a message queue *\n");
printw("* 2:sending message *\n");
printw("* 3:receiving message *\n");
printw("* 4:remove a message queue *\n");
printw("* 0:Exit *\n");
printw("*********\n");
refresh();
}
int get_queue() {
int key = ftok(".", 'q');
if (key == -1) {
perror("ftok");
return -1;
}
int queue_id = msgget(key, IPC_CREAT | 0666);
if (queue_id == -1) {
perror("msgget");
return -1;
}
printw("Message queue created with id %d\n", queue_id);
refresh();
return queue_id;
}
int send_message(int queue_id) {
message_t message;
printw("Enter message: ");
refresh();
echo();
getstr(message.text);
noecho();
message.type = 1;
if (msgsnd(queue_id, &message, strlen(message.text) + 1, 0) == -1) {
perror("msgsnd");
return -1;
}
printw("Message sent\n");
refresh();
return 0;
}
int receive_message(int queue_id) {
message_t message;
if (msgrcv(queue_id, &message, MAX_MSG_SIZE, 1, 0) == -1) {
perror("msgrcv");
return -1;
}
printw("Received message: %s\n", message.text);
refresh();
return 0;
}
int remove_queue(int queue_id) {
if (msgctl(queue_id, IPC_RMID, NULL) == -1) {
perror("msgctl");
return -1;
}
printw("Message queue removed\n");
refresh();
return 0;
}
int main() {
int choice, queue_id = -1;
initscr();
while (1) {
print_menu();
echo();
scanw("%d", &choice);
noecho();
switch(choice) {
case 0:
if (queue_id != -1) {
remove_queue(queue_id);
}
endwin();
return 0;
case 1:
if (queue_id == -1) {
queue_id = get_queue();
} else {
printw("Message queue already exists\n");
refresh();
}
break;
case 2:
if (queue_id == -1) {
printw("Message queue does not exist\n");
refresh();
} else {
send_message(queue_id);
}
break;
case 3:
if (queue_id == -1) {
printw("Message queue does not exist\n");
refresh();
} else {
receive_message(queue_id);
}
break;
case 4:
if (queue_id == -1) {
printw("Message queue does not exist\n");
refresh();
} else {
remove_queue(queue_id);
queue_id = -1;
}
break;
default:
printw("Invalid choice\n");
refresh();
break;
}
sleep(1);
}
}
```
注意,这只是一个简单的示例,实际应用中需要添加更多的错误处理和安全性检查。
阅读全文