📄 example2-05.c
字号:
/************************************************************* * 用消息队列实现的进程间通信的例子example2-05.c example2-06.c ************************************************************//***************************************************************************** * 首先服务进程建立一个消息队列,然后去读此消息队列中客户端发来的消息 (此消息中应该包括客户端的进程ID和一个文件的路径名)。 * 读到消息后,服务器端会按指定的路径名去读文件,然后将文件内容再写回消息队列。 * 此后,客户端会来读取服务进程为它返回的文件内容,然后打印到标准输出。 *****************************************************************************/ /***************************************** * 消息队列实例 服务器端程序example2-05.c *****************************************/#include <stdio.h>#include <sys/msg.h>#include <sys/ipc.h>#include <sys/types.h>#include <errno.h>#include <string.h>#define MAXMESGDATA 1000#define SVMSG_MODE 777struct mymesg { //定义用户自己的数据结构 long mesg_len; /* #bytes in mesg_data, can be 0 */ long mesg_type; /* message type, must be > 0 */ char mesg_data[MAXMESGDATA];};size_t msg_send(int id, struct mymesg *mptr){ return(msgsnd(id, &(mptr->mesg_type), mptr->mesg_len, 0));}/* end mesg_send */size_t mesg_recv(int id, struct mymesg *mptr){ ssize_t n; n = msgrcv(id, &(mptr->mesg_type), MAXMESGDATA, mptr->mesg_type, 0); mptr->mesg_len = n; /* return #bytes of data */ return(n); /* -1 on error, 0 at EOF, else >0 */}int main(){ int msgid; FILE *fp; char *ptr; pid_t pid; ssize_t n; struct mymesg mesg; msgid = msgget(1234, SVMSG_MODE | IPC_CREAT); /*、以1234为key创建一个消息队列 */ for( ; ; ) { /*循环从消息队列中读取客户请求 */ mesg.mesg_type = 1; if ((n = mesg_recv(msgid, &mesg)) == 0) { //判断消息是否为空 printf("pathname missing"); continue; } mesg.mesg_data[n] = '\0'; /*将消息的数据段格式化成以空字符结束的字符串 */ //即在数据末尾添加“\0”作为结束标志。 if ((ptr = strchr(mesg.mesg_data, ' ')) == NULL) { printf("bogus request: %s", mesg.mesg_data); continue; } *ptr++ = 0; pid = atol(mesg.mesg_data); /*获得发送消息的客户进程的进程号 */ mesg.mesg_type = pid; if ((fp = fopen(ptr, "r")) == NULL) { /*以只读方式打开所请求文件 */ snprintf(mesg.mesg_data + n, sizeof(mesg.mesg_data) -n, ":can't open, %s\n", strerror(errno)); mesg.mesg_len = strlen(ptr); memmove(mesg.mesg_data, ptr, mesg.mesg_len); msg_send(msgid, &mesg); /*将文件内容写回消息队列 */ //即服务器将读到的客户端请求的消息返回给客户端 } else { /*若文件不存在,则将客户的请求消息内容再写回消息队列 */ while(fgets(mesg.mesg_data, MAXMESGDATA, fp) != NULL) { mesg.mesg_len = strlen(mesg.mesg_data); msg_send(msgid, &mesg); } fclose(fp); } mesg.mesg_len = 0; msg_send(msgid, &mesg); } exit(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -