#include <stdio.h> #include <sys/types.h> #include <sys/msg.h> #include <sys/ipc.h> #define MSGKEY 75 struct msgform { long mtype; char mtext[1030]; }msg; int msgqid,i; void CLIENT() { int i; msgqid=msgget(MSGKEY,0777); for (i=10;i>=1;i--) { msg.mtype=i; printf("(client) sent \n"); msgsnd(msgqid,&msg,1024,0); 16 } exit(0); } void SERVER() { msgqid=msgget(MSGKEY,0777|IPC_CREAT); do{ msgrcv(msgqid,&msg,1030,0,0); printf("(Server) recieved\n"); } while(msg.mtype!=1); msgctl(msgqid,IPC_RMID,0); exit(0); } void main() { while((i=fork())==-1); if(!i) SERVER(); while((i=fork())==-1); if(!i) CLIENT(); wait(0); wait(0); }
时间: 2024-04-20 20:27:23 浏览: 94
这段代码实现了一个简单的消息队列通信程序,包括一个服务端和一个客户端。客户端向服务端发送一组消息,服务端接收消息并输出。具体实现如下:
1. 定义了一个消息结构体 msgform,包括消息类型和消息内容。
2. 在客户端函数 CLIENT() 中,首先获取消息队列的标识符 msgqid,然后利用 for 循环向服务端发送 10 组消息,每组消息的类型从 10 到 1 递减。发送消息使用 msgsnd 函数,其中第一个参数是消息队列标识符,第二个参数是指向消息结构体的指针,第三个参数是消息长度,第四个参数是消息发送标志。
3. 在服务端函数 SERVER() 中,首先创建一个消息队列并获取其标识符 msgqid,然后利用 do-while 循环接收客户端发送的消息,直到接收到类型为 1 的消息为止。接收消息使用 msgrcv 函数,其中第一个参数是消息队列标识符,第二个参数是指向消息结构体的指针,第三个参数是消息长度,第四个参数是消息类型,第五个参数是消息接收标志。
4. 最后在 main 函数中,使用 fork 函数创建服务端和客户端两个子进程,分别调用 SERVER() 和 CLIENT() 函数。使用 wait 函数等待两个子进程结束。
需要注意的是,在发送消息时,消息长度应该是 1024,而在接收消息时,消息长度应该是 1030。这是因为消息结构体中的 mtext 字段有 1030 字节,其中前 4 个字节是消息类型,后面 1026 个字节是消息内容。
相关问题
请用文字画出下面程序的流程图#include <stdio.h> #include <sys/types.h> #include <sys/msg.h> #include <sys/ipc.h> #define MSGKEY 75 struct msgform { long mtype; char mtext[1030]; }msg; int msgqid,i; void CLIENT() { int i; msgqid=msgget(MSGKEY,0777); for (i=10;i>=1;i--) { msg.mtype=i; printf("(client) sent \n"); msgsnd(msgqid,&msg,1024,0); } exit(0); } void SERVER() { msgqid=msgget(MSGKEY,0777|IPC_CREAT); do{ msgrcv(msgqid,&msg,1030,0,0); printf("(Server) recieved\n"); } while(msg.mtype!=1); msgctl(msgqid,IPC_RMID,0); exit(0); } void main() { while((i=fork())==-1); if(!i) SERVER(); while((i=fork())==-1); if(!i) CLIENT(); wait(0); wait(0); }
由于无法插入图片,我将文字描述程序的流程图如下:
主函数main()中,先通过fork()创建两个子进程。第一个子进程通过调用SERVER()函数,进入服务端代码段。第二个子进程通过调用CLIENT()函数,进入客户端代码段。
在CLIENT()函数中,先调用msgget()函数获取消息队列的标识符msgqid,然后通过循环,将消息类型i从10到1依次发送出去。在发送消息之前,先将消息类型i赋值给msg.mtype,然后调用msgsnd()函数将msg发送到消息队列中。
在SERVER()函数中,同样先调用msgget()函数获取消息队列的标识符msgqid,然后通过do-while循环,调用msgrcv()函数从消息队列中接收消息,并进行处理。当接收到的消息类型为1时,调用msgctl()函数删除消息队列。
最后,主函数main()通过调用wait()等待两个子进程结束,程序运行结束。
#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "MQTTClient.h" #include <stdint.h> #include <signal.h> /* sigaction */ #include <errno.h> #include "sqlite3.h" #include "pan_reg.h" #include "spi_func.h" #include "auxiliary.h" #if !defined(WIN32) #include <unistd.h> #else #include <windows.h> #endif #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <math.h> /* modf */ #include "cJSON.h" #include <fcntl.h> #include "uart.h" #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h>
这是一段 C 语言的代码,包含了一些头文件的引用,如 pthread.h、stdio.h、stdlib.h、string.h、MQTTClient.h、stdint.h、signal.h、errno.h、sqlite3.h、netdb.h、sys/types.h、sys/socket.h、netinet/in.h、math.h、cJSON.h、fcntl.h 和 uart.h。这段代码中可能包含了一些线程库、网络库、消息队列、JSON 解析等相关的函数。具体实现需要查看代码的具体逻辑。
阅读全文