8.29作业

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

代码展示

send.c

#include <myhead.h>
struct msgbuf{
	long mtype;
	char mtext[1024];
};
#define len sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
	key_t key = ftok("./1.txt",'8');
	if(key == -1){
		perror("ftok");
		return -1;
	}
	int msgid = msgget(key,IPC_CREAT|0664);
	if(msgid==-1){
		perror("msgget");
		return -1;
	}
	struct msgbuf m;
	while(1){
		printf("请输入消息的类型:");
		scanf("%ld",&m.mtype);
		getchar();
		printf("请输入消息的正文:");
		fgets(m.mtext,sizeof(m.mtext),stdin);
		m.mtext[strlen(m.mtext)-1] = '\0';
		msgsnd(msgid,&m,len,0);
		if(strcmp(m.mtext,"quit")==0){
			break;
		}
	}
	if(msgctl(msgid,IPC_RMID,NULL)==-1){
		printf("删除队列失败\n");
		return -1;
	}
	return 0;
}

rev.c

#include <myhead.h>
struct msgbuf{
	long mtype;
	char mtext[1024];
};
#define len sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
	key_t key = ftok("./1.txt",'8');
	if(key == -1){
		perror("ftok");
		return -1;
	}
	int msgid = msgget(key,IPC_CREAT|0664);
	if(msgid==-1){
		perror("msgget");
		return -1;
	}
	struct msgbuf m;
	while(1){
		
		msgrcv(msgid,&m,len,0,0);
		printf("%s\n",m.mtext);
		if(strcmp(m.mtext,"quit")==0){
			break;
		}
	}
	return 0;
}

运行结果

在这里插入图片描述

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

代码展示

send.c

#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);
		buff[strlen(buff)-1] = '\0';
		strcpy(shmAdd,buff);
		if(strcmp(shmAdd,"quit")==0){
			break;
		}
	}

	if(shmdt(shmAdd)==-1){//取消当前进程共享内存段访问
		perror("shmdt");
		return -1;
	}

	if(shmctl(shmID,IPC_RMID,NULL)==-1){//删除共享内存段
		perror("shmctl");
		return -1;
	}
	return 0;
}

rev.c

#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;
	}

	while(1){
		printf("%s\n",shmAdd);
		if(strcmp(shmAdd,"quit")==0){
			break;
		}
	}
	if(shmdt(shmAdd)==-1){
		perror("shmdt");
		return -1;
	}

	return 0;
}

运行结果

在这里插入图片描述

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

代码展示

user1.c

不准确

#include <myhead.h>

struct msgbuf{
	long mtype;
	char mtext[1024];
};
#define len sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
	int fk = fork();
	if(fk > 0){
		key_t key = ftok("./1.txt",'8');
		if(key == -1){
			perror("ftok");
			return -1;
		}
		int msgid = msgget(key,IPC_CREAT|0664);
		if(msgid == -1){
			perror("msgget");
			return -1;
		}
		struct msgbuf m;
		while(1){
			printf("请输入消息的类型:");
			scanf("%ld",&m.mtype);
			getchar();
			printf("请输入消息的正文:");
			fgets(m.mtext,sizeof(m.mtext),stdin);
			m.mtext[strlen(m.mtext)-1] = '\0';
			msgsnd(msgid,&m,len,0);
			if(strcmp(m.mtext,"quit")==0){
				break;
			}
		}
		if(msgctl(msgid,IPC_RMID,NULL)==-1){
			printf("删除队列失败\n");
			return -1;
		}
	}else if(fk == 0){
		key_t key = ftok("./2.txt",'8');
		if(key == -1){
			perror("ftok");
			return -1;
		}
		int msgid = msgget(key,IPC_CREAT|0664);
		if(msgid == -1){
			perror("msgget");
			return -1;
		}
		struct msgbuf r;
		while(1){
			msgrcv(msgid,&r,len,0,0);
			if(strcmp(r.mtext,"quit")==0){
				break;
			}
			printf("%s\n",r.mtext);
		}
		exit(EXIT_SUCCESS);
	}else {
		perror("fork");
		return -1;
	}
	return 0;
}

user2.c

#include <myhead.h>

struct msgbuf{
	long mtype;
	char mtext[1024];
};
#define len sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
	int fk = fork();
	if(fk > 0){
		key_t key = ftok("./2.txt",'8');
		if(key == -1){
			perror("ftok");
			return -1;
		}
		int msgid = msgget(key,IPC_CREAT|0664);
		if(msgid == -1){
			perror("msgget");
			return -1;
		}
		struct msgbuf m;
		while(1){
			printf("请输入消息的类型:");
			scanf("%ld",&m.mtype);
			getchar();
			printf("请输入消息的正文:");
			fgets(m.mtext,sizeof(m.mtext),stdin);
			m.mtext[strlen(m.mtext)-1] = '\0';
			msgsnd(msgid,&m,len,0);
			if(strcmp(m.mtext,"quit")==0){
				break;
			}
		}
		if(msgctl(msgid,IPC_RMID,NULL)==-1){
			printf("删除队列失败\n");
			return -1;
		}

	}else if(fk == 0){
		key_t key = ftok("./1.txt",'8');
		if(key == -1){
			perror("ftok");
			return -1;
		}
		int msgid = msgget(key,IPC_CREAT|0664);
		if(msgid == -1){
			perror("msgget");
			return -1;
		}
		struct msgbuf r;
		while(1){
			msgrcv(msgid,&r,len,0,0);
			if(strcmp(r.mtext,"quit")==0){
				break;
			}
			printf("%s\n",r.mtext);
		}
		exit(EXIT_SUCCESS);
	}else {
		perror("fork");
		return -1;
	}
	return 0;
}

运行结果

在这里插入图片描述

今日思维导图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值