#define MSGKEY 75 #define MAX_TYPE 10 // 最大消息类型 struct msgform { long mtype; char mtext[256]; } msg; int msgqid, i; void client() { int i; msgqid = msgget(MSGKEY, 0777); for (i = MAX_TYPE; i >= 1; i--) { msg.mtype = i; printf("input your string in smg:"); scanf("%s", msg.mtext); msgsnd(msgqid, &msg, 256, 0); printf("(client) send\n"); sleep(1); } exit(0); } void server() { msgqid = msgget(MSGKEY, 0777 | IPC_CREAT); int is_done = 0; int types[] = {5, 4, 3, 2, 1}; int ntypes = sizeof(types) / sizeof(int); for (int i = 0; i < ntypes && !is_done; i++) { msgrcv(msgqid, &msg, 256, types[i], 0); printf("(server) received string: %s\n", msg.mtext); printf("(server) received\n"); is_done = (msg.mtype == 1); } exit(0); } int main() { while ((i = fork()) == -1); if (i == 0) server(); while ((i = fork()) == -1); if (i == 0) client(); wait(0); wait(0); msgctl(msgget(MSGKEY, 0777), IPC_RMID, 0); return 0; }
时间: 2024-03-30 10:33:15 浏览: 14
这是一个使用 System V 消息队列实现的简单的客户端-服务器交互程序。其中,客户端通过输入字符串,将不同类型的消息发送给服务器。服务器则按照特定顺序接收不同类型的消息,并输出消息内容。当服务器接收到类型为 1 的消息时,退出程序。
具体实现中,使用了 msgget() 函数创建或获取一个消息队列,msgsnd() 函数将消息发送到队列中,msgrcv() 函数从队列中接收消息。msgctl() 函数则用于删除消息队列。
需要注意的是,在发送和接收消息时,需要指定消息的类型。在本程序中,将消息类型定义为整型,从 MAX_TYPE 到 1 依次发送给服务器。在服务器中,按照特定顺序接收不同类型的消息。当接收到类型为 1 的消息时,退出程序。
另外,程序中使用了 fork() 函数创建子进程,并使用 wait() 函数等待子进程结束。这是因为客户端和服务器需要同时运行,且需要在消息队列被删除之前结束。
相关问题
Server.c #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/msg.h> #include <sys/ipc.h> #define MSGKEY 75 struct msgform { long mtype; char mtext[1000]; }msg; int msgqid; void server() { msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*创建 75#消息队列*/ do { msgrcv(msgqid,&msg,1030,0,0); /*接收消息*/ printf("(server)received\n"); }while(msg.mtype!=1); msgctl(msgqid,IPC_RMID,0); /*删除消息队列,归还资源*/ exit(0); } Void main() { server(); }:运行结果是什么?该程序为什么需要在后台运行 server.c?若不如此会出现什么现 象?为什么?
运行该程序会创建一个消息队列,然后在一个循环中接收客户端发送的消息,直到接收到类型为1的消息后删除消息队列并退出程序。
该程序需要在后台运行,否则会阻塞当前终端,无法进行其他操作。因为在接收消息时,如果没有消息到达,程序会一直停留在 msgrcv 函数处等待消息到达,直到有消息到达才会继续往下执行,如果程序在前台运行,就会一直占用当前终端,无法进行其他操作。
#include <stdio.h> #include <stdlib.h> 9 #include <sys/types.h> #include <sys/msg.h> #include <sys/ipc.h> #define MSGKEY 75 struct msgform { long mtype; char mtext[1000]; }msg; int msgqid; void client() { int i; msgqid=msgget(MSGKEY,0777); /*打开 75#消息队列*/ for(i=10;i>=1;i--) { msg.mtype=i; printf("(client)sent\n"); msgsnd(msgqid,&msg,1024,0); /*发送消息*/ } exit(0); } Void main() { client(); }:两个程序的含义是什么?请解释其运行结果的含义?
这段代码包含了一个客户端程序和一个主函数,主函数只是调用了客户端程序。
客户端程序的功能是向消息队列发送消息,每个消息的类型是从 10 到 1 递减的。在发送消息之前,它首先通过 msgget() 函数打开一个具有 75 这个键值的消息队列。
主函数只是简单地调用了客户端程序。
运行结果的含义是,客户端程序向消息队列发送了 10 条消息,每条消息的类型从 10 到 1 递减。由于没有接收者来处理这些消息,它们最终会留在消息队列中,等待被接收。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)