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

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

经典操作: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
Linux进程间通信(IPC)介绍:详细解析IPC的执行流程、状态和通信机制
Linux进程间通信(IPC)介绍:详细解析IPC的执行流程、状态和通信机制
55 1
|
4月前
|
消息中间件 存储 Unix
进程间通信和线程间通信总结
写在前面 面试的时候一定不要疲劳战,比如上午面了一个,然后中午不休息直接赶到另外一个相距比较远的公司,影响状态。 面试的时候一定不要紧张,不管对方有几个人,总之面试的时候做好充分准备,休息好,放松心态。 好了,言归正传,开始总结。
39 0
|
4月前
|
消息中间件 存储 程序员
进程间的通信
进程间的通信
33 1
|
5月前
|
Linux
百度搜索:蓝易云【【Linux】进程间的通信之共享内存】
总结而言,Linux中的共享内存是一种用于进程间通信的高效机制,它允许多个进程共享同一块物理内存区域,实现数据的快速交换。通过适当的创建、连接、分离和删除操作,可以实现进程对共享内存的使用和管理。
223 7
|
3月前
|
编解码 监控 API
操作系统:进程的控制和通信(Windows2000)
操作系统:进程的控制和通信(Windows2000)
45 0
|
1月前
|
消息中间件 Linux API
跨进程通信设计:Qt 进程间通讯类全面解析
跨进程通信设计:Qt 进程间通讯类全面解析
80 0
|
1月前
|
消息中间件 并行计算 网络协议
探秘高效Linux C/C++项目架构:让进程、线程和通信方式助力你的代码飞跃
探秘高效Linux C/C++项目架构:让进程、线程和通信方式助力你的代码飞跃
34 0
|
2月前
|
Python
Python多进程间通信的最佳实践
Python多进程间通信的最佳实践
|
2月前
|
消息中间件 Linux
Linux下的系统编程——进程间的通信(九)
Linux下的系统编程——进程间的通信(九)
37 1
Linux下的系统编程——进程间的通信(九)
|
3月前
|
存储 缓存 Unix
C语言第四章(进程间的通信,管道通信,pipe()函数)
C语言第四章(进程间的通信,管道通信,pipe()函数)
56 0

相关实验场景

更多