进程间通信--消息队列(msg)--实现自由通信
2017-05-21 12:14
465 查看
//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 200 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, 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) 4000 { 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; }
相关文章推荐
- 使用微软消息队列实现C#进程间通信(转)
- IPC之 - 使用微软消息队列实现C#进程间通信
- 练习--LINUX进程间通信之消息队列MSG
- 使用微软消息队列实现C#进程间通信
- 进程间通信:消息队列(代码实现)
- UNIX环境下如何应用消息队列实现进程间通信
- Linux下利用消息队列实现进程间通信
- 消息队列实现进程间通信
- 进程间通信:消息队列实现双向通信
- 【Linux】消息队列--实现进程间通信
- 使用微软消息队列实现C#进程间通信(二)
- 使用微软消息队列实现C#进程间通信
- C#_使用微软消息队列实现C#进程间通信
- 进程间通信 :消息队列的实现
- [转]使用微软消息队列实现C#进程间通信
- 使用微软消息队列实现C#进程间通信(三)
- 使用微软消息队列实现C#进程间通信
- 使用微软消息队列实现C#进程间通信
- PHP 进程间通信——消息队列(msg_queue)
- 进程间通信:消息队列(代码实现)