Linux通信IPC随笔

名字: HLS大神 QQ:331908961
**功能:Linux内核间任意通信实现在这里插入图片描述
**
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>

typedef struct MSGBUF_STRU
{
long mType;
char mText[50];
}MSGBUF;

/*******************************************************
函数功能:字符串比较
函数形参:@const char *str1: 输入的字符串
@const char *str2: 待比较的字符串
函数返回值:@*str1 > *str2: 1
@*str1 < *str2: -1
@*str1 == *str2: 0
备注:None
作者:HLS
日期:2021/03/25
版本:V0.0
********************************************************/
int myStrcmp(const char *str1, const char *str2)
{
const char *pStr1 = str1, *pStr2 = str2;

while(*pStr1 != ':' || *pStr2 != ':')
{
	if(*pStr1 < *pStr2)
	{
		return -1;
	}else if(*pStr1 > *pStr2)
	{
		return 1;
	}
	
	pStr1++;   //指针偏移 直到遇到冒号跳出
	pStr2++;
}

return 0;

}

//进程A
int main(int argc, char *argv[])
{
int msqid;
char buf[50] = {0};
key_t key;
pid_t ret_1, ret_2;

if(argc != 4)
{
	printf("请按这样的形式输入:%s 您的昵称 对象B昵称 对象C昵称", argv[0]);
	return -1;
}

key = ftok("./1234.text", 1);//获取键值

msqid = msgget(key, IPC_CREAT | 0600);//获取消息队列id

ret_1 = fork( );//创建子进程1

if(ret_1 == -1)
{
	printf("子进程1创建失败\r\n");
	return -2;
}else if(ret_1 == 0)//子进程1接收对象C的消息
{
	int len;
	MSGBUF rBuf = {4, {0}};
	
	while(1)
	{
		len = msgrcv(msqid, &rBuf, sizeof(rBuf.mText), 4, MSG_NOERROR);//接收消息队列的消息
		if(len)
		{
			fputs(rBuf.mText, stdout);
		}
	}
}else
{
	ret_2 = fork( );//创建子进程2
	
	if(ret_2 < 0)
	{
		printf("子进程2创建失败\r\n");
		return -3;		
	}else if(ret_2 == 0)//子进程2接收对象B的消息
	{
		int len;
		MSGBUF rBuf = {3, {0}};
		
		while(1)
		{
			len = msgrcv(msqid, &rBuf, sizeof(rBuf.mText), 3, MSG_NOERROR);//接收消息队列的消息
			if(len)
			{
				fputs(rBuf.mText, stdout);
			}
		}
	}else//父进程发送消息
	{
		char argvBufB[10] = {0}, argvBufC[10] = {0};
		MSGBUF tBufB = {1, {0}}, tBufC = {2, {0}};
		
		//将要发送的对象昵称放入数组里
		sprintf(argvBufB, "to %s:", argv[2]);
		sprintf(argvBufC, "to %s:", argv[3]);
		
		while(1)
		{				
			fgets(buf, sizeof(buf), stdin);//从终端获取要发送的消息
			
			if(myStrcmp(argvBufB, buf) == 0)//向对象B发送消息
			{
				sprintf(tBufB.mText, "from %s %s", argv[1], buf);//将昵称加入消息里
			
				ret_1 = msgsnd(msqid, &tBufB, sizeof(tBufB.mText), MSG_NOERROR);//往消息队列发送消息
				if(ret_1 == -1)
				{
					printf("发送消息失败\r\n");
				}
				
				fputs(tBufB.mText, stdout);
			}else if(myStrcmp(argvBufC, buf) == 0)//向对象C发送消息
			{
				sprintf(tBufC.mText, "from %s %s", argv[1], buf);//将昵称加入消息里
			
				ret_1 = msgsnd(msqid, &tBufC, sizeof(tBufC.mText), MSG_NOERROR);//往消息队列发送消息
				if(ret_1 == -1)
				{
					printf("发送消息失败\r\n");
				}
				
				fputs(tBufC.mText, stdout);
			}
			
			memset(buf, 0, sizeof(buf));//清空数组
		}
	}
}

}

//进程B
int main(int argc, char *argv[])
{
int msqid;
char buf[50] = {0};
key_t key;
pid_t ret_1, ret_2;

if(argc != 4)
{
	printf("请按这样的形式输入:%s 您的昵称 对象A昵称 对象C昵称", argv[0]);
	return -1;
}

key = ftok("./1234.text", 1);//获取键值

msqid = msgget(key, IPC_CREAT | 0600);//获取消息队列id

ret_1 = fork( );//创建子进程1

if(ret_1 == -1)
{
	printf("子进程1创建失败\r\n");
	return -2;
}else if(ret_1 == 0)//子进程1接收对象C的消息
{
	int len;
	MSGBUF rBuf = {6, {0}};
	
	while(1)
	{
		len = msgrcv(msqid, &rBuf, sizeof(rBuf.mText), 6, MSG_NOERROR);//接收消息队列的消息
		if(len)
		{
			fputs(rBuf.mText, stdout);
		}
	}
}else
{
	ret_2 = fork( );//创建子进程2
	
	if(ret_2 < 0)
	{
		printf("子进程2创建失败\r\n");
		return -3;		
	}else if(ret_2 == 0)//子进程2接收对象A的消息
	{
		int len;
		MSGBUF rBuf = {1, {0}};
		
		while(1)
		{
			len = msgrcv(msqid, &rBuf, sizeof(rBuf.mText), 1, MSG_NOERROR);//接收消息队列的消息
			if(len)
			{
				fputs(rBuf.mText, stdout);
			}
		}
	}else//父进程发送消息
	{
		char argvBufA[10] = {0}, argvBufC[10] = {0};
		MSGBUF tBufA = {3, {0}}, tBufC = {5, {0}};
		
		//将要发送的对象昵称放入数组里
		sprintf(argvBufA, "to %s:", argv[2]);
		sprintf(argvBufC, "to %s:", argv[3]);
		
		while(1)
		{				
			fgets(buf, sizeof(buf), stdin);//从终端获取要发送的消息
			
			if(myStrcmp(argvBufA, buf) == 0)//向对象A发送消息
			{
				sprintf(tBufA.mText, "from %s %s", argv[1], buf);//将昵称加入消息里
			
				ret_1 = msgsnd(msqid, &tBufA, sizeof(tBufA.mText), MSG_NOERROR);//往消息队列发送消息
				if(ret_1 == -1)
				{
					printf("发送消息失败\r\n");
				}
				
				fputs(tBufA.mText, stdout);
			}else if(myStrcmp(argvBufC, buf) == 0)//向对象C发送消息
			{
				sprintf(tBufC.mText, "from %s %s", argv[1], buf);//将昵称加入消息里
			
				ret_1 = msgsnd(msqid, &tBufC, sizeof(tBufC.mText), MSG_NOERROR);//往消息队列发送消息
				if(ret_1 == -1)
				{
					printf("发送消息失败\r\n");
				}
				
				fputs(tBufC.mText, stdout);
			}
			
			memset(buf, 0, sizeof(buf));//清空数组
		}
	}
}

}

//进程C
int main(int argc, char *argv[])
{
int msqid;
char buf[50] = {0};
key_t key;
pid_t ret_1, ret_2;

if(argc != 4)
{
	printf("请按这样的形式输入:%s 您的昵称 对象A昵称 对象B昵称", argv[0]);
	return -1;
}

key = ftok("./1234.text", 1);//获取键值

msqid = msgget(key, IPC_CREAT | 0600);//获取消息队列id

ret_1 = fork( );//创建子进程1

if(ret_1 == -1)
{
	printf("子进程1创建失败\r\n");
	return -2;
}else if(ret_1 == 0)//子进程1接收对象B的消息
{
	int len;
	MSGBUF rBuf = {5, {0}};
	
	while(1)
	{
		len = msgrcv(msqid, &rBuf, sizeof(rBuf.mText), 5, MSG_NOERROR);//接收消息队列的消息
		if(len)
		{
			fputs(rBuf.mText, stdout);
		}
	}
}else
{
	ret_2 = fork( );//创建子进程2
	
	if(ret_2 < 0)
	{
		printf("子进程2创建失败\r\n");
		return -3;		
	}else if(ret_2 == 0)//子进程2接收对象A的消息
	{
		int len;
		MSGBUF rBuf = {2, {0}};
		
		while(1)
		{
			len = msgrcv(msqid, &rBuf, sizeof(rBuf.mText), 2, MSG_NOERROR);//接收消息队列的消息
			if(len)
			{
				fputs(rBuf.mText, stdout);
			}
		}
	}else//父进程发送消息
	{
		char argvBufA[10] = {0}, argvBufB[10] = {0};
		MSGBUF tBufA = {4, {0}}, tBufB = {6, {0}};
		
		//将要发送的对象昵称放入数组里
		sprintf(argvBufA, "to %s:", argv[2]);
		sprintf(argvBufB, "to %s:", argv[3]);
		
		while(1)
		{				
			fgets(buf, sizeof(buf), stdin);//从终端获取要发送的消息
			
			if(myStrcmp(argvBufA, buf) == 0)//向对象A发送消息
			{
				sprintf(tBufA.mText, "from %s %s", argv[1], buf);//将昵称加入消息里
			
				ret_1 = msgsnd(msqid, &tBufA, sizeof(tBufA.mText), MSG_NOERROR);//往消息队列发送消息
				if(ret_1 == -1)
				{
					printf("发送消息失败\r\n");
				}
				
				fputs(tBufA.mText, stdout);
			}else if(myStrcmp(argvBufB, buf) == 0)//向对象B发送消息
			{
				sprintf(tBufB.mText, "from %s %s", argv[1], buf);//将昵称加入消息里
			
				ret_1 = msgsnd(msqid, &tBufB, sizeof(tBufB.mText), MSG_NOERROR);//往消息队列发送消息
				if(ret_1 == -1)
				{
					printf("发送消息失败\r\n");
				}
				
				fputs(tBufB.mText, stdout);
			}
			
			memset(buf, 0, sizeof(buf));//清空数组
		}
	}
}

}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式开发星球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值