名字: 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));//清空数组
}
}
}
}