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

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

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

目录
相关文章
|
9天前
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
40 16
|
3月前
|
存储 Unix Linux
进程间通信方式-----管道通信
【10月更文挑战第29天】管道通信是一种重要的进程间通信机制,它为进程间的数据传输和同步提供了一种简单有效的方法。通过合理地使用管道通信,可以实现不同进程之间的协作,提高系统的整体性能和效率。
|
3月前
|
消息中间件 存储 供应链
进程间通信方式-----消息队列通信
【10月更文挑战第29天】消息队列通信是一种强大而灵活的进程间通信机制,它通过异步通信、解耦和缓冲等特性,为分布式系统和多进程应用提供了高效的通信方式。在实际应用中,需要根据具体的需求和场景,合理地选择和使用消息队列,以充分发挥其优势,同时注意其可能带来的复杂性和性能开销等问题。
|
9月前
|
安全
【进程通信】信号的捕捉原理&&用户态与内核态的区别
【进程通信】信号的捕捉原理&&用户态与内核态的区别
|
4月前
|
存储 Python
Python中的多进程通信实践指南
Python中的多进程通信实践指南
51 0
|
5月前
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
481 4
|
6月前
|
Linux
Linux源码阅读笔记13-进程通信组件中
Linux源码阅读笔记13-进程通信组件中
|
6月前
|
消息中间件 安全 Java
Linux源码阅读笔记13-进程通信组件上
Linux源码阅读笔记13-进程通信组件上
|
6月前
|
消息中间件 存储 安全
python多进程并发编程之互斥锁与进程间的通信
python多进程并发编程之互斥锁与进程间的通信
|
7月前
|
消息中间件 分布式计算 网络协议
从管道路由到共享内存:进程间通信的演变(内附通信方式经典面试题及详解)
进程间通信(Inter-Process Communication, IPC)是计算机科学中的一个重要概念,指的是运行在同一系统或不同系统上的多个进程之间互相发送和接收信息的能力。IPC机制允许进程间共享数据、协调执行流程,是实现分布式系统、多任务操作系统和并发编程的基础。
105 0
从管道路由到共享内存:进程间通信的演变(内附通信方式经典面试题及详解)

热门文章

最新文章

相关实验场景

更多