进程间通信--消息队列(msg)--实现自由通信
来源:互联网 发布:软件框架设计的艺术 编辑:程序博客网 时间:2024/06/05 03:40
//msg(消息队列)--是将消息按队列的方式组织成的链表#include"utili.h"#include<stdio.h>#include<unistd.h>#include<sys/ipc.h>#include<sys/shm.h>#include<sys/sem.h>#include<sys/msg.h>#include<string.h>#include<stdlib.h>//............ser.c#include"utili.h"#define SEND_TYPE 100#define RECV_TYPE 200typedef struct MsgType{ long msg_type; char msg_buf[256];}MsgType;int main(){ key_t msg_key; msg_key = ftok("mymsg",0xff); if(msg_key == -1) { perror("ftok"); exit(1); } int msg_id = msgget(msg_key, IPC_CREAT|0755); if(msg_id == -1) { perror("msgget"); exit(1); } MsgType msg; pid_t pid1,pid2; pid1=fork(); int status; if(pid1 == -1) { printf("create fork error\n"); exit(1); } else if(pid1 == 0) { while(1) { msgrcv(msg_id, &msg, 256, RECV_TYPE, 0); printf("Cli:>%s\n",msg.msg_buf); } } else if(pid1 > 0) { pid2 = fork(); if(pid2 == -1) { printf("create fork2 erroe\n"); exit(1); } if(pid2 == 0) { while(1) { printf("Ser:>"); scanf("%s",msg.msg_buf); if(strcmp(msg.msg_buf,"quit") == 0) { close(msg_id); break; } msg.msg_type = SEND_TYPE; msgsnd(msg_id, &msg, strlen(msg.msg_buf)+1, 0); } } else if(pid2>0) { wait(&status); } } /* ---只能实现你一句我一句 MsgType msg; while(1) { printf("Ser:>"); scanf("%s",msg.msg_buf); msg.msg_type = SEND_TYPE; msgsnd(msg_id, &msg, strlen(msg.msg_buf)+1, 0); msgrcv(msg_id, &msg, 256, RECV_TYPE, 0); printf("Cli:>%s\n",msg.msg_buf); } */ return 0;}#..............cli.c#include"utili.h"#define SEND_TYPE 200#define RECV_TYPE 100/*int msgsnd(int msqid,const void *ptr,size_t length,int flag); ID号 发送消息的指针 长度 访问标记 其中ptr是一个结构指针,模板如下: */typedef struct MsgType{ long msg_type; char msg_buf[256];}MsgType;int main(){ key_t msg_key; msg_key = ftok("mymsg",0xff); if(msg_key == -1) { perror("ftok"); exit(1); } int msg_id = msgget(msg_key, 0); if(msg_id == -1) { perror("msgget"); exit(1); } MsgType msg; pid_t pid1,pid2; pid1=fork(); int status; if(pid1 == -1) { printf("create fork error\n"); exit(1); } else if(pid1 == 0) { while(1) { msgrcv(msg_id, &msg, 256, RECV_TYPE, 0); printf("Ser:>%s\n",msg.msg_buf); } } else if(pid1 >0) { pid2 = fork(); if(pid2 ==-1) { printf("create fork2 error\n"); exit(1); } else if(pid2 == 0) { while(1) { printf("Cli:>"); scanf("%s",msg.msg_buf); if(strcmp(msg.msg_buf,"quit") == 0) { close(msg_id); break; } msg.msg_type = SEND_TYPE; msgsnd(msg_id, &msg, strlen(msg.msg_buf)+1, 0); } } else if(pid2>0) { wait(&status); } } /* while(1) { msgrcv(msg_id, &msg, 256, RECV_TYPE, 0); printf("Ser:>%s\n",msg.msg_buf); printf("Cli:>"); scanf("%s",msg.msg_buf); msg.msg_type = SEND_TYPE; msgsnd(msg_id, &msg, strlen(msg.msg_buf)+1, 0); } */ return 0; }
阅读全文
0 0
- 进程间通信--消息队列(msg)--实现自由通信
- 进程间通信之消息队列msg queue
- 消息队列实现进程间通信
- 进程间通信:消息队列(代码实现)
- 进程间通信:消息队列(代码实现)
- 【Linux】消息队列--实现进程间通信
- Linux消息队列实现进程间通信
- 消息队列实现进程间通信
- linux消息队列实现进程间通信
- 深入理解Linux进程间通信(IPC)-- 消息队列msg
- 进程间消息队列通信
- 进程间通信:消息队列
- 进程间通信--消息队列
- 进程间通信-消息队列
- 进程间通信-消息队列
- 进程间通信----消息队列
- 进程间通信-消息队列
- 进程间通信-消息队列
- Mybatis系列之接口式编程
- 使用VRTK在场景中实现传送 (二)
- SSH框架下的条件查询及查询结果分页
- Android studio导入eclipse项目且不改变目录结构
- Jqeury(事件)
- 进程间通信--消息队列(msg)--实现自由通信
- Java-字符串中对象的比较,详细流程
- C++引用详解
- [py]c和java笔记语法对比
- Ubuntu fcitx输入法无法显示候选词
- 为项目编写start.sh,stop.sh
- ArrayAdapter模板
- C++引用理解
- 杭电 #1013