实现进程间相互通信操作流程

简介: 实现进程间相互通信操作流程

经典操作: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);
    }
  }
}

20210520103012653.png

目录
相关文章
|
1月前
|
存储 Unix Linux
进程间通信方式-----管道通信
【10月更文挑战第29天】管道通信是一种重要的进程间通信机制,它为进程间的数据传输和同步提供了一种简单有效的方法。通过合理地使用管道通信,可以实现不同进程之间的协作,提高系统的整体性能和效率。
|
1月前
|
消息中间件 存储 供应链
进程间通信方式-----消息队列通信
【10月更文挑战第29天】消息队列通信是一种强大而灵活的进程间通信机制,它通过异步通信、解耦和缓冲等特性,为分布式系统和多进程应用提供了高效的通信方式。在实际应用中,需要根据具体的需求和场景,合理地选择和使用消息队列,以充分发挥其优势,同时注意其可能带来的复杂性和性能开销等问题。
|
2月前
|
存储 Python
Python中的多进程通信实践指南
Python中的多进程通信实践指南
29 0
|
7月前
|
安全
【进程通信】信号的捕捉原理&&用户态与内核态的区别
【进程通信】信号的捕捉原理&&用户态与内核态的区别
|
7月前
|
Shell
【进程通信】利用管道创建进程池(结合代码)
【进程通信】利用管道创建进程池(结合代码)
|
3月前
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
392 4
|
4月前
|
Linux
Linux源码阅读笔记13-进程通信组件中
Linux源码阅读笔记13-进程通信组件中
|
4月前
|
消息中间件 安全 Java
Linux源码阅读笔记13-进程通信组件上
Linux源码阅读笔记13-进程通信组件上
|
4月前
|
消息中间件 存储 安全
python多进程并发编程之互斥锁与进程间的通信
python多进程并发编程之互斥锁与进程间的通信
|
4月前
|
Python
Python IPC深度探索:解锁跨进程通信的无限可能,以管道与队列为翼,让你的应用跨越边界,无缝协作,震撼登场
【8月更文挑战第3天】Python IPC大揭秘:解锁进程间通信新姿势,让你的应用无界连接
28 0