zl程序教程

您现在的位置是:首页 >  其他

当前栏目

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

流程进程通信 实现 操作 相互
2023-09-14 09:13:23 时间

龙大神随笔:
经典操作: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);
		}
	}
}

}

在这里插入图片描述