#include "wrapper.h" char *mygetpid(char *str); char *getfirst(char *str); typedef struct MESSAGE { long mtype; char mtext[512]; } mymsg, *pmymsg; int main(int argc, char *argv[]) { int rtn; int msqid; key_t key; mymsg msginfo; char first[512]; char buf[512]; if (argc != 2) { fprintf(stderr, "请以./task72s<key>的形式运行给出的消息队列键值\n"); exit(0); } sscanf(argv[1], "%x", &key); msqid = msgget(key, 0644); msginfo.mtype = 1; while (1) { memset(msginfo.mtext, 0, sizeof(msginfo.mtext)); rtn = msgrcv(msqid, (pmymsg)&msginfo, sizeof(msginfo.mtext), 1, 0); if (rtn == -1) continue; strcpy(first, msginfo.mtext); printf("收到消息:%s\n", first); strcat(buf, "receipt of "); strcat(buf, getfirst(msginfo.mtext)); strcat(buf, " from 白校珲's server to Process "); strcat(buf, mygetpid(first)); strcpy(msginfo.mtext, buf); rtn = msgsnd(msqid, &msginfo, strlen(msginfo.mtext), 0); sleep(1); memset(buf, 0, sizeof(buf)); if (strcmp(first, "close") == 0) { return 0; } } } //服务端提取消息对应的线程 char *mygetpid(char *str) { char *p[21]; memcpy(p, str, 4); char *t; p[0] = strtok(str, " "); int i = 0; while (p[i] != NULL) { i++; p[i] = strtok(NULL, " "); } t = p[i - 1]; return t; } char *getfirst(char *str) { char *p[21]; memcpy(p, str, 4); char *t; p[0] = strtok(str, " "); t = p[0]; return t; }
时间: 2024-02-02 07:03:10 浏览: 102
这段代码是一个接收消息的服务端程序,它通过指定的消息队列键值获取消息队列的标识符,然后循环等待接收消息,并对接收到的消息进行处理。
具体来说,程序首先从命令行参数中获取消息队列的键值,并使用 `msgget` 函数获取消息队列的标识符。然后,程序进入一个无限循环,每次循环使用 `msgrcv` 函数接收消息,并对接收到的消息进行处理。如果接收到的消息内容为 "close",则结束程序。
在处理消息时,程序使用了两个辅助函数 `mygetpid` 和 `getfirst`。这两个函数都是对字符串进行解析的函数,用于提取出消息中的一些信息。
具体来说,`mygetpid` 函数用于从消息中提取出发送该消息的进程的 PID,它通过使用 `strtok` 函数将消息内容按空格分割,并返回分割后的最后一个字符串,即进程的 PID。
`getfirst` 函数则用于获取消息中的第一个单词(以空格为分隔符),它也是使用 `strtok` 函数实现的。
处理完消息后,程序将结果通过调用 `msgsnd` 函数发送回客户端,并使用 `sleep` 函数暂停 1 秒钟,避免消息发送过快导致程序出错。
需要注意的是,程序使用了 `memset` 函数和 `strcat` 函数来操作字符串,这些函数需要保证操作的字符串长度足够,否则可能会出现内存访问越界等错误。因此,在使用这些函数时需要格外小心,并注意检查字符串长度。
阅读全文