IO线程进程

1、将消息队列发送接收端实现一遍。

发送函数:

#include <myhead.h>
struct msgbuf
{
	long mtype;//消息类型
	char mtext[1000];//消息正文,长度自定义
};
#define leng sizeof(struct msgbuf)-sizeof(long) //定义正文大小
int main(int argc, const char *argv[])
{
	key_t key=ftok("./",'B');//创建密钥key
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}
	printf("键:%#x\n",key);//输出key值
	int msgID=msgget(key,IPC_CREAT|0664);//创建消息队列
	if(msgID==-1)
	{
		perror("msgget");
		return -1;
	}
	printf("msgid=%d\n",msgID);//输出消息队列id

	struct msgbuf send;//定义结构体变量
	while(1)
{
	printf("请输入消息的类型\n");
	scanf("%ld",&send.mtype);
	getchar();//吸收回车键
	printf("请输入消息的内容\n");
	fgets(send.mtext,sizeof(send.mtext),stdin);//终端从键盘获得正文
	send.mtext[strlen(send.mtext)-1]='\0';
	msgsnd(msgID,&send,leng,0);//leng是正文大小,0表示阻塞发送
	if(strcmp(send.mtext,"quit")==0)
	{
		break;
	}
}
if(msgctl(msgID,IPC_RMID,NULL)==-1)//删除消息队列
{
	printf("删除队列失败\n");
	return -1;
}
	return 0;
}

接收函数:

#include <myhead.h>
struct msgbuf
{
	long mtype;//消息类型
	char mtext[1000];//消息正文,长度自定义
};
#define leng sizeof(struct msgbuf)-sizeof(long) //定义正文大小
int main(int argc, const char *argv[])
{
	key_t key=ftok("./",'B');//创建密钥key
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}
	printf("键:%#x\n",key);//输出key值
	int msgID=msgget(key,IPC_CREAT|0664);//创建消息队列
	if(msgID==-1)
	{
		perror("msgget");
		return -1;
	}
	printf("msgid=%d\n",msgID);//输出消息队列id

	struct msgbuf rcv;//定义结构体变量
	while(1)
{
	msgrcv(msgID,&rcv,leng,0,0);
	//第一个0:读取第一个消息,第二个0:阻塞接受
	printf("%s\n",rcv.mtext);
	if(strcmp(rcv.mtext,"quit\n")==0)
	{
		break;
	}
}
	return 0;
}

2、将共享内存发送接收实现一遍。

发送函数:

#include <myhead.h>

#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{
	key_t key=ftok("./",'W');
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}
	int shmID=shmget(key,PAGE_SIZE,IPC_CREAT|0664);//获取内存段的id
	if(shmID==-1)
	{
		perror("shmget");
		return -1;
	}
	char *shmADD=shmat(shmID,NULL,0);//获取内存段的的映射地址
	if(shmADD==(void *)-1)
	{
		perror("shmat");
		return -1;
	}
	char buff[1024];
	while(1)
	{
		printf("请输入共享内存的数据:");
		fgets(buff,sizeof(buff),stdin);
//		getchar();
		strcpy(shmADD,buff);
		if(strcmp(shmADD,"quit\n")==0)
		{
			break;
		}
	}
	if(shmdt(shmADD)==-1)//取消当前进程访问此共享内存段
	{
		perror("shmdt");
		return -1;
	}
	if(shmctl(shmID,IPC_RMID,NULL)==-1)//删除共享内存段
	{
		perror("shmctl");
		return -1;
	}

	return 0;
}

接收函数:

#include <myhead.h>

#define PAGE_SIZE 4096
int main(int argc, const char *argv[])
{
	key_t key=ftok("./",'W');
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}
	int shmID=shmget(key,PAGE_SIZE,IPC_CREAT|0664);//获取内存段的id
	if(shmID==-1)
	{
		perror("shmget");
		return -1;
	}
	char *shmADD=shmat(shmID,NULL,0);//获取内存段的的映射地址
	if(shmADD==(void *)-1)
	{
		perror("shmat");
		return -1;
	}
	char buff[1024];
	while(1)
	{
		printf("%s\n",shmADD);
		if(strcmp(shmADD,"quit\n")==0)
		{
			break;
		}
	}
	if(shmdt(shmADD)==-1)//取消访问
	{
		perror("shmdt");
		return -1;
	}
	return 0;
}

3、建立两个.c 建立子父进程,父进程发送消息到队列,子进程读取队列,另一个同样。

子父进程1:

#include <myhead.h>
#define leng sizeof(struct msgbb)-sizeof(long)//定义正文大小
struct msgbb
{
	long mtype;//消息类型
	char mtext[1000];//消息正文
};
int main(int argc, const char *argv[])
{
	pid_t pid;
	pid=fork();
	if(pid>0)//父进程1
	{
		key_t key = ftok("./",'A');//密钥
		if(key==-1)
		{
			perror("ftok");
			return -1;
		}
	
	int msgID=msgget(key,IPC_CREAT|0664);//消息队列		
	if(msgID==-1)
	{
		perror("msgget");
		return -1;
	}
	struct msgbb send;//结构体变量
	while(1)
	{
		printf("请输入消息的类型:");
		scanf("%ld",&send.mtype);
		printf("请输入消息的内容:");
		fgets(send.mtext,sizeof(send.mtext),stdin);
		send.mtext[strlen(send.mtext)-1]='\0';
		msgsnd(msgID,&send,leng,0);//发送给消息队列
		if(strcmp(send.mtext,"quit")==0)
		{
			break;
		}
	if(msgctl(msgID,IPC_RMID,NULL)==-1)
	{
		printf("删除失败\n");
		return -1;
	}
	}
	}
	else if(pid==0)//子进程1
	{
		
		key_t key=ftok("./",'B');//密钥
		if(key==-1)
		{
			perror("ftok");
			return -1;
		}
	
	int msgID=msgget(key,IPC_CREAT|0664);//消息队列		
	if(msgID==-1)
	{
		perror("msgget");
		return -1;
	}
	struct msgbb rcv;//结构体变量
	while(1)
	{
		msgrcv(msgID,&rcv,leng,0,0);//接收消息队列内容
		printf("%s\n",rcv.mtext);
		if(strcmp(rcv.mtext,"quit")==0)
		{
			break;
		}
	}
	}
	else
	{
		perror("fork");
		return -1;
	}
	return 0;
}

子父进程2:

#include <myhead.h>
#define leng sizeof(struct msgbb)-sizeof(long)//定义正文大小
struct msgbb
{
	long mtype;//消息类型
	char mtext[1000];//消息正文
};
int main(int argc, const char *argv[])
{
	pid_t pid;
	pid=fork();
	if(pid>0)//父进程1
	{
		key_t key=ftok("./",'B');//密钥
		if(key==-1)
		{
			perror("ftok");
			return -1;
		}

	int msgID=msgget(key,IPC_CREAT|0664);//消息队列		
	if(msgID==-1)
	{
		perror("msgget");
		return -1;
	}
	struct msgbb send;//结构体变量
	while(1)
	{
		printf("请输入消息的类型:");
		scanf("%ld",&send.mtype);
		printf("请输入消息的内容:");
		fgets(send.mtext,sizeof(send.mtext),stdin);
		send.mtext[strlen(send.mtext)-1]='\0';
		msgsnd(msgID,&send,leng,0);//发送给消息队列
		if(strcmp(send.mtext,"quit")==0)
		{
			break;
		}
	if(msgctl(msgID,IPC_RMID,NULL)==-1)
	{
		printf("删除失败\n");
		return -1;
	}
	}
	}
	else if(pid==0)//子进程1
	{
		
		key_t key=ftok("./",'A');//密钥
		if(key==-1)
		{
			perror("ftok");
			return -1;
		}
	
	int msgID=msgget(key,IPC_CREAT|0664);//消息队列		
	if(msgID==-1)
	{
		perror("msgget");
		return -1;
	}
	struct msgbb rcv;//结构体变量
	while(1)
	{
		msgrcv(msgID,&rcv,leng,0,0);//接收消息队列内容
		printf("%s\n",rcv.mtext);
		if(strcmp(rcv.mtext,"quit")==0)
		{
			break;
		}
	}
	}
	else
	{
		perror("fork");
		return -1;
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值