实现进程间相互通信操作流程
龙大神随笔:
经典操作:ABC三个进程,实现三个进程之间任一通信。
//进程A
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
struct msgbuf{
long mtype;
char text[640];
};
struct msgbuf t_msg,r_msg;
int msqid;
int main(void)
{
key_t key;
pid_t ret;
key=ftok("./1234.txt",1);
msqid = msgget(key,IPC_CREAT|0600);
printf("msqid=%d\r\n",msqid);
ret=fork();
if(ret==-1)
{
perror("fork failed\r\n");
return -1;
}
if(ret==0)
{
//child
while(1)
{
memset(&t_msg,0,sizeof(t_msg));
scanf("%s",t_msg.text);
if(strncmp("toB",t_msg.text,3)==0)
{
t_msg.mtype=2;
msgsnd(msqid,&t_msg,sizeof(t_msg.text),0);
}
if(strncmp("toC",t_msg.text,3)==0)
{
t_msg.mtype=4;
msgsnd(msqid,&t_msg,sizeof(t_msg.text),0);
}
}
}else
{
//parent
int len1,len2;
while(1)
{
len1 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),1,IPC_NOWAIT);
if(len1==-1)
{
;
}
else
{
printf("fromB:%s\r\n",r_msg.text+4);
}
len2 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),3,IPC_NOWAIT);
if(len2==-1)
{
;
}
else
{
printf("fromC:%s\r\n",r_msg.text+4);
}
}
}
}
//进程B
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
struct msgbuf{
long mtype;
char text[640];
};
struct msgbuf t_msg,r_msg;
int msqid;
int main(void)
{
key_t key;
pid_t ret;
key=ftok("./1234.txt",1);
msqid = msgget(key,IPC_CREAT|0600);
printf("msqid=%d\r\n",msqid);
ret=fork();
if(ret==-1)
{
perror("fork failed\r\n");
return -1;
}
else if(ret==0)
{
//child
while(1)
{
memset(&t_msg,0,sizeof(t_msg));
scanf("%s",t_msg.text);
if(strncmp("toA",t_msg.text,3)==0)
{
t_msg.mtype=1;
msgsnd(msqid,&t_msg,sizeof(t_msg.text),0);
}
if(strncmp("toC",t_msg.text,3)==0)
{
t_msg.mtype=5;
msgsnd(msqid,&t_msg,sizeof(t_msg.text),0);
}
}
}else
{
//parent
int len1,len2;
while(1)
{
len1 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),2,IPC_NOWAIT);
if(len1==-1)
{
;
}
else
{
printf("fromA:%s\r\n",r_msg.text+4);
}
len2 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),6,IPC_NOWAIT);
if(len2==-1)
{
;
}
else
{
printf("fromC:%s\r\n",r_msg.text+4);
}
}
}
}
//进程C
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
struct msgbuf{
long mtype;
char text[640];
};
struct msgbuf t_msg,r_msg;
int msqid;
int main(void)
{
key_t key;
pid_t ret;
key=ftok("./1234.txt",1);
msqid = msgget(key,IPC_CREAT|0600);
printf("msqid=%d\r\n",msqid);
ret=fork();
if(ret==-1)
{
perror("fork failed\r\n");
return -1;
}
else if(ret==0)
{
//child---send
while(1)
{
memset(&t_msg,0,sizeof(t_msg));
scanf("%s",t_msg.text);
if(strncmp("toA",t_msg.text,3)==0)
{
t_msg.mtype=3;
msgsnd(msqid,&t_msg,sizeof(t_msg.text),0);
}
if(strncmp("toB",t_msg.text,3)==0)
{
t_msg.mtype=6;
msgsnd(msqid,&t_msg,sizeof(t_msg.text),0);
}
}
}else
{
//parent---receive
int len1,len2;
while(1)
{
len1 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),4,IPC_NOWAIT);
if(len1==-1)
{
;
}
else
{
printf("fromA:%s\r\n",r_msg.text+4);
}
len2 = msgrcv(msqid,&r_msg,sizeof(r_msg.text),5,IPC_NOWAIT);
if(len2==-1)
{
;
}
else
{
printf("fromB:%s\r\n",r_msg.text+4);
}
}
}
}
相关文章
- 企业团队使用Git协同开发的一般流程
- ARM-Linux移植之(三)——init进程启动流程分析
- 应用商店流程2
- activity之Activity启动流程
- SpringMvc的基本流程
- Nginx请求流程和进程结构
- C++:C++编程语言学习之基本数据类型/流程控制(if else/switch/for/while循环语句)的简介、案例应用之详细攻略
- Android Init进程的启动流程
- 华为开发者大会HDC.Cloud硬核技术解读:知识图谱构建流程及方法
- 【云速建站】几个基本概念和流程解释
- 【Android 逆向】Dalvik 函数抽取加壳 ④ ( 类加载流程分析 | native 函数查询 | dalvik_system_DexFile.cpp#defineClassNative函数)
- ASP.NET MVC流程解说
- 008-Shell 流程控制
- Android视频录制-MediaRecorder流程
- 一文教你测试流程是什么?如何设计测试用例?【小白都懂系列】
- 高通MSM8953 Android7.1蓝牙接电话流程(App到Adsp)(十六)