IO IPC练习 (CTRL+C功能待完成)

使用消息队列实现的2个终端之间的互相聊天
并使用信号控制消息队列的读取方式:
    当键盘按ctrl+c的时候,切换消息读取方式,一般情况为读取指定编号的消息,按ctrl+c之后,指定的编号不读取,读取其他所有编号的消息

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/wait.h>
#include <pthread.h>
#include <sys/ipc.h>
#include <sys/msg.h>

//发送端

struct msgbuf{
	long type;
	char buf[128];
};
void* run(void* arg) //子线程接收端
{
	key_t key = ftok("./ipc",1);
	if(-1 == key)
	{
		perror("ftok");
		//return 1;
	}
	//int msgtype = atoi(argv[1]);
	int msgtype = 2;
	printf("请输入msgtype,默认为2:");
	scanf("%d",&msgtype);
	getchar();
	int id = msgget(key,IPC_CREAT | 0666);

	if(-1 == id)
	{
		perror("msgget");
	//	return 1;
	}
	struct msgbuf msg;
	int size = 0;
	while(1)
	{
		memset(&msg,0,sizeof(msg));
		msgrcv(id,&msg,128,msgtype,0);
		printf("读取到的数据为:%s\n",msg.buf);
	}
}

int main(int argc, const char *argv[])
{
	pthread_t tid;
	
	if(pthread_create(&tid,0,run,0) != 0) //开启线程
	{
		perror("pthread_create");
		return 1;
	}
	if (argc != 2)
	{
		printf("参数错误\n");
		return 1;
	}
	int msgtype = atoi(argv[1]);
	//第一步,获取密钥
	key_t key = ftok("./ipc",1);//根据文件名和编号,生成一个密钥
	if(-1 == key)
	{
		perror("ftok");
		return 1;
	}
	//根据密钥创建/访问消息队列
	int id = msgget(key,IPC_CREAT | 0666);//根据密钥,返回消息队列的编号
	if (-1 == id)
	{
		perror("msgget");
		return 1;
	}
	struct msgbuf msg;
	int size = 0;

	while(1)
	{
		memset(&msg,0,sizeof(msg));//先将结构体清零
		msg.type = msgtype; //确认消息编号
		printf("请输入:");
		scanf("%128s",msg.buf);
		while(getchar() != 10);
		size = strlen(msg.buf);
		msgsnd(id,&msg,size,0);//将消息写入编号id的消息队列中,
							   //想要发送的消息的地址
							   //真正消息大小,不包含前8个字节
							   //无视消息编号,发送物理意义第一条消息
	}
	return 0;
}
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/wait.h>
#include <pthread.h>
#include <sys/ipc.h>
#include <sys/msg.h>

//接收端

struct msgbuf{
	long type;
	char buf[128];
};

void* run(void* arg) //子线程发送
{
	key_t key = ftok("./ipc",1);
	if(-1 == key){
		perror("ftok");
		//return 1
	}
	int msgtype = 2;
	printf("请输入msgtype,没有默认为2");
	scanf("%d",&msgtype);
	getchar();
	
	int id = msgget(key,IPC_CREAT | 0666);
	if(-1 == id)
	{
		perror("msgget");
		//return 1;
	}
	struct msgbuf msg;
	int size = 0;
	while(1)
	{
		memset(&msg,0,sizeof(msg));
		msg.type = msgtype;
		printf("请输入:");
		scanf("%128s",msg.buf);
		while(getchar() != 10);
		size = strlen(msg.buf);
		msgsnd(id,&msg,size,0);
	}
}

int main(int argc, const char *argv[])
{
	pthread_t tid;
	if(pthread_create(&tid,0,run,0) != 0)
	{
		perror("pthread_create");
		return 1;
	}

	key_t key = ftok("./ipc",1);//根据./目录的ipc文件和编号1确定一个密钥key
	if(-1 == key)
	{
		perror("ftok");
		return 1;
	}
	int msgtype = atoi(argv[1]);//将参数argv[1]强制转换成int形

	int id = msgget(key,IPC_CREAT | 0666);//根据密钥key,返回消息队列的编号id,
										  //如果消息队列不存在,则以0666的权限去创建
	if(-1 == id)
	{
		perror("msgget");
		return 1;
	}

	struct msgbuf msg;
	int size = 0;
	while(1)
	{
		memset(&msg,0,sizeof(msg));
		msgrcv(id,&msg,128,msgtype,0);//消息队列描述符
										   //结构体地址
										   //不包含8个头字节的最大尺寸
										   //用来指定读取消息队列,哪个编号的队列
										   //传0,表示以阻塞形式读取消息
		printf("读取的数据为:%s\n",msg.buf);
	}




	return 0;
}

内容概要:本文系统介绍了标准化和软件知识产权的基础知识,涵盖标准化的基本概念、分类、标准代号、国际标准的采用原则及程度,重点讲解了信息技术标准化、ISO与IEC等国际标准化组织以及ISO9000和ISO/IEC15504等重要标准体系;在知识产权部分,详细阐述了知识产权的定义、分类及特点,重点分析了计算机软件著作权的主体、客体、权利内容、行使方式、保护期限及侵权认定,同时涉及商业秘密的构成与侵权形式、专利权的类型与申请条件,以及企业如何综合运用著作权、专利、商标和商业秘密等方式保护软件知识产权。; 适合人群:从事软件开发、项目管理、IT标准化或知识产权相关工作的技术人员与管理人员,以及备考相关资格考试的学习者;具备一定信息技术背景,希望系统掌握标准化与软件知识产权基础知识的专业人员。; 使用场景及目标:①帮助理解各类标准的分类体系及国际标准采用方式,提升标准化实践能力;②指导企业在软件研发过程中有效保护知识产权,规避法律风险;③为软件著作权登记、专利申请、技术保密等提供理论依据和操作指引。; 阅读建议:建议结合国家相关政策法规和实际案例进行深入学习,重点关注软件著作权与专利权的适用边界、标准制定流程及企业知识产权管理策略,强化理论与实践的结合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值