IO第6天

实现AB进程对话

A进程发送一句话后,B进程接收到打印。然后B进程发送一句话,A进程接收后打印b。重复上述步骤。直到AB接收或者发送完quit后,结束AB进程

使用消息队列实现

//A文件
#include <myhead.h>

struct msgbuf{
	long mtype;
	char mtext[128];
};

int main(int argc, const char *argv[])
{
	//创建key
	key_t key=ftok("/home/ubuntu/",1);
	if(key<0){
		perror("ftok");
		return -1;
	}
	
	//找到或创建消息队列
	int msgid=msgget(key,IPC_CREAT|0664);
	if(msgid<0){
		perror("msgget");
		return -1;
	}
	system("ipcs -q");

	//准备数据
	struct msgbuf snd;
	struct msgbuf rcv;
	while(1){
		//写
		printf("请输入消息类型>>>");
		scanf("%ld",&snd.mtype);
		getchar();

		printf("请输入消息内容>>>");
		fgets(snd.mtext,sizeof(snd.mtext),stdin);
		snd.mtext[strlen(snd.mtext)-1]='\0';

		//发送消息
		if(msgsnd(msgid,&snd,sizeof(snd.mtext),0)<0){
			perror("msgsnd");
			break;
		}
		if(strcmp(snd.mtext,"quit")==0){
			printf("退出\n");
			break;
		}
		printf("发送成功\n");

		//读	
		if(msgrcv(msgid,&rcv,sizeof(rcv.mtext),0,0)<0){
			perror("msgrcv");
			break;
		}
		if(strcmp(rcv.mtext,"quit")==0){
			printf("退出\n");
			break;
		}
		printf("mtype=%ld mtext=%s\n",rcv.mtype,rcv.mtext);
	}

	//关闭消息队列
	if(msgctl(msgid,IPC_RMID,NULL)<0){
		perror("msgctl");
		return -1;
	}
	system("ipcs -q");

	return 0;
}
//B文件
#include <myhead.h>

struct msgbuf{
	long mtype;
	char mtext[128];
};

int main(int argc, const char *argv[])
{
	//创建key
	key_t key=ftok("/home/ubuntu/",1);
	if(key<0){
		perror("ftok");
		return -1;
	}
	
	//找到或创建消息队列
	int msgid=msgget(key,IPC_CREAT|0664);
	if(msgid<0){
		perror("msgget");
		return -1;
	}

	//准备数据
	struct msgbuf snd;
	struct msgbuf rcv;
	while(1){
		//读
		if(msgrcv(msgid,&rcv,sizeof(rcv.mtext),0,0)<0){
			perror("msgrcv");
			break;
		}

		if(strcmp(rcv.mtext,"quit")==0){
			printf("退出\n");
			break;
		}                                    
		printf("mtype=%ld mtext=%s\n",rcv.mtype,rcv.mtext);

		//写
		printf("请输入消息类型>>>");
		scanf("%ld",&snd.mtype);
		getchar();

		printf("请输入消息内容>>>");
		fgets(snd.mtext,sizeof(snd.mtext),stdin);
		snd.mtext[strlen(snd.mtext)-1]='\0';

		//发送消息
		if(msgsnd(msgid,&snd,sizeof(snd.mtext),0)<0){
			perror("msgsnd");
			break;
		}
		if(strcmp(snd.mtext,"quit")==0){
			printf("退出\n");
			break;
		}
		printf("发送成功\n");
	}
	
	//关闭消息队列
	if(msgctl(msgid,IPC_RMID,NULL)<0){
		perror("msgctl");
		return -1;
	}
	system("ipcs -q");


	return 0;
}

要求在共享内存中存入字符串“1234567”。

A进程循环打印字符串,B进程循环倒置字符串,要求结果不允许出现乱序:

提示:共享内存+信号灯集

//A文件
#include <myhead.h>
int main(int argc, const char *argv[])
{
	//创建key值
	key_t key=ftok("/home/ubuntu/",1);
	if(key<0){
		perror("ftok");
		return -1;
	}
	printf("key=%#x\n",key);
	
	//创建信号灯集
	int semid=semget(key,1,IPC_CREAT|0664);
	if(semid<0){
		perror("semget");
		return -1;
	}
	printf("semid=%d\n",semid);
	system("ipcs -s");
	
	//找到共享内存或创建
	int shmid=shmget(key,128,IPC_CREAT|0664);
	if(shmid<0){
		perror("shmget");
		return -1;
	}
	printf("shmid=%d\n",shmid);
	system("ipcs -m");

	//映射
	void* shmaddr=shmat(shmid,NULL,0);
	if(shmaddr==(void*)-1){
		perror("shmat");
		return -1;
	}
	printf("shmaddr=%p\n",shmaddr);
	char* ptr=(char*)shmaddr;
	strcpy(ptr,"1234567");
	//printf("%s\n",ptr);

	struct sembuf sops;
	//v 初始值为0,先v+1再p
	sops.sem_num=0; //操作0号灯
	sops.sem_op=1; //+1 v操作
	sops.sem_flg=0; //默认阻塞
	if(semop(semid,&sops,1)<0){
		perror("semop");
		return -1;
	}

	while(1){
		//p
		sops.sem_num=0; //操作0号灯
		sops.sem_op=-1; //-1 p操作
		sops.sem_flg=0; //默认阻塞

		if(semop(semid,&sops,1)<0){
			perror("semop");
			return -1;
		}
		printf("%s\n",ptr);

		//v
		sops.sem_num=0; //操作0号灯
		sops.sem_op=1; //+1 v操作
		sops.sem_flg=0; //默认阻塞
		if(semop(semid,&sops,1)<0){
			perror("semop");
			return -1;
		}
	}

	//断开映射
	shmdt(shmaddr);
	
	//删除共享内存
	shmctl(shmid,IPC_RMID,NULL);

	//删除信号灯集
	semctl(semid,1,IPC_RMID);

	system("ipcs -s");

	system("ipcs -m");
	
	
	return 0;
}
//B文件
#include <myhead.h>
int main(int argc, const char *argv[])
{
	//创建key值
	key_t key=ftok("/home/ubuntu/",1);
	if(key<0){
		perror("ftok");
		return -1;
	}
	printf("key=%#x\n",key);
	
	//创建信号灯集
	int semid=semget(key,1,IPC_CREAT|0664);
	if(semid<0){
		perror("semget");
		return -1;
	}
	printf("semid=%d\n",semid);
	system("ipcs -s");
	
	//找到共享内存或创建
	int shmid=shmget(key,128,IPC_CREAT|0664);
	if(shmid<0){
		perror("shmget");
		return -1;
	}
	printf("shmid=%d\n",shmid);
	system("ipcs -m");

	//映射
	void* shmaddr=shmat(shmid,NULL,0);
	if(shmaddr==(void*)-1){
		perror("shmat");
		return -1;
	}
	printf("shmaddr=%p\n",shmaddr);
	char* ptr=(char*)shmaddr;
	strcpy(ptr,"1234567");
	//printf("%s\n",ptr);

	struct sembuf sops;
	char* start=NULL;
	char* end=NULL;
	char temp=0;
	while(1){
		//p -1
		sops.sem_num=0; //操作0号灯          
		sops.sem_op=-1; //-1 p操作
		sops.sem_flg=0; //默认阻塞
		if(semop(semid,&sops,1)<0){
			perror("semop");
			return -1;
		}
		//翻转字符串
		start=shmaddr;
		end=start+strlen(start)-1;
		while(start<end){
			temp=*start;
			*start=*end;
			*end=temp;
			start++;
			end--;
		}

		//v +1
		sops.sem_num=0; //操作0号灯
		sops.sem_op=1; //+1 v操作
		sops.sem_flg=0; //默认阻塞
		if(semop(semid,&sops,1)<0){
			perror("semop");
			return -1;
		}

	}

	//断开映射
	shmdt(shmaddr);
	
	//删除共享内存
	shmctl(shmid,IPC_RMID,NULL);

	//删除信号灯集
	semctl(semid,1,IPC_RMID);

	system("ipcs -s");

	system("ipcs -m");
	
	
	return 0;
}
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值