华清 8月23 io进程线程 day7作业

1>
#include 

#define SIZE sizeof(msg_ds)-sizeof(long)

//定义消息结构体
typedef struct
{
	long msgtype;  //消息类型
	char data[1024];  //消息正文
}msg_ds;

void *task(void *arg)
{
	key_t key=ftok("/",'k');
	if(key==-1)
	{
		perror("ftok1 error");
		return NULL;
	}
	int msgid=msgget(key,IPC_CREAT|0664);
	if(msgid==-1)
	{
		perror("msgget error");
		return NULL;
	}
	msg_ds msg2;
	while(1)
	{
		if(msgrcv(msgid,&msg2,SIZE,10,0)==-1)
		{
			perror("msgrcv error");
			return NULL;
		}
		if(strcmp(msg2.data,"quit")==0)
		{
			break;
		}
		printf("取得的数据为: %s\n",msg2.data);
	}
}



int main(int argc, const char *argv[])
{

	//创建子线程
	pthread_t tid;
	if(pthread_create(&tid,NULL,task,NULL))
	{
		printf("子线程创建失败\n");
		return -1;
	}



	//1.创建key值
	key_t key=ftok("/",'k');
	if(key==-1)
	{
		perror("ftok error");
		return -1;
	}
	
	//2.创建消息队列
	int msgid=msgget(key,IPC_CREAT|0664);
	if(msgid==-1)
	{
		perror("msgget error");
		return -1;
	}
	
	//3.向消息队列中发送数据
	
	msg_ds msg1={.msgtype=5};  //消息类型设置为5

	for(;;)
	{
		printf("请输入消息内容\n");
		fgets(msg1.data,sizeof(msg1.data),stdin);
		//加'\0'
		msg1.data[strlen(msg1.data)-1]='\0';
		
		//将消息发送到消息队列中
		if(msgsnd(msgid,&msg1,SIZE,0)==-1)
		{
			perror("msgsnd error");
			return -1;
		}
		if(strcmp(msg1.data,"quit")==0)
		{
			break;
		}
	}
	
	pthread_join(tid,NULL);

	return 0;
}
2>
#include 

#define SIZE sizeof(msg_ds)-sizeof(long)

//定义消息结构体
typedef struct
{
	long msgtype;  //消息类型
	char data[1024];  //消息正文
}msg_ds;

void *task(void *arg)
{
	key_t key=ftok("/",'k');
	if(key==-1)
	{
		perror("ftok1 error");
		return NULL;
	}
	int msgid=msgget(key,IPC_CREAT|0664);
	if(msgid==-1)
	{
		perror("msgget error");
		return NULL;
	}
	msg_ds msg2={.msgtype=10};
	while(1)
	{
		printf("请输入消息的内容:\n");
		fgets(msg2.data,sizeof(msg2.data),stdin);
		msg2.data[strlen(msg2.data)-1]='\0';

		if(msgsnd(msgid,&msg2,SIZE,0)==-1)
		{
			perror("msgrcv error");
			return NULL;
		}
		if(strcmp(msg2.data,"quit")==0)
		{
			break;
		}
	}
}



int main(int argc, const char *argv[])
{

	//创建子线程
	pthread_t tid;
	if(pthread_create(&tid,NULL,task,NULL))
	{
		printf("子线程创建失败\n");
		return -1;
	}



	//1.创建key值
	key_t key=ftok("/",'k');
	if(key==-1)
	{
		perror("ftok error");
		return -1;
	}
	
	//2.创建消息队列
	int msgid=msgget(key,IPC_CREAT|0664);
	if(msgid==-1)
	{
		perror("msgget error");
		return -1;
	}
	
	//3.向消息队列中发送数据
	
	msg_ds msg1;  //消息类型设置为5

	for(;;)
	{
		
		//将消息发送到消息队列中
		if(msgrcv(msgid,&msg1,SIZE,5,0)==-1)
		{
			perror("msgrcv error");
			return -1;
		}
		if(strcmp(msg1.data,"quit")==0)
		{
			break;
		}
		printf("取得的数据为: %s\n",msg1.data);
	}
	pthread_join(tid,NULL);

	return 0;
}

效果图

华清 8月23 io进程线程 day7作业_第1张图片

第三章:进程线程通信 - GitMind

你可能感兴趣的:(linux)