9.14作业

在这里插入图片描述

#include <myhead.h>
char buf[]="1234567";
sem_t sem1,sem2;
void* output(void*arg)
{
	while(1){
		if(sem_wait(&sem1)==0){//P操作
			printf("%s\n",buf);
			sem_post(&sem2);//V操作
		}
		else{	
			ERR_MSG("sem_wait");
		}
	}
}
void* turn(void*arg)
{
	while(1){
		if(sem_wait(&sem2)==0){//P操作
			for(int i=0;i<strlen(buf)/2;i++){
				char t=buf[i];
				buf[i]=buf[strlen(buf)-1-i];
				buf[strlen(buf)-1-i]=t;
			}
			sem_post(&sem1);//V操作
		}
		else{
			ERR_MSG("sem_wait");
		}
	}
}
int main(int argc, const char *argv[])
{
	if(sem_init(&sem1,0,1)<0){
		ERR_MSG("sem_init");
	}
	if(sem_init(&sem2,0,0)<0){
		ERR_MSG("sem_init");
	}
	pthread_t tid1,tid2;
	pthread_create(&tid1,NULL,output,NULL);
	pthread_create(&tid2,NULL,turn,NULL);
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	sem_destroy(&sem1);
	sem_destroy(&sem2);
	return 0;
}

#include <myhead.h>
	
int main(int argc, const char *argv[])
{
	key_t key =ftok("./05v.c",1);
	if(key<0)
	{
		ERR_MSG("ftok");
	}
	int shmid = shmget(key,32,IPC_CREAT|0664);//创建共享内存
	if(shmid<0){
		ERR_MSG("shmid");
	}
	void *addr = shmat(shmid,NULL,0);//映射到用户空间
	if((void*)-1==addr)
	{
		ERR_MSG("shmat");
	}
	int semid = semget(key,2,IPC_CREAT|0664);//创建信号灯集
	if(semid<0){
		ERR_MSG("semget");
	}
	int *flag=(int*)addr;
	*flag=0;
	char *p2=(char*)(flag+1);
	strcpy(p2,"1234567");//共享内存赋值
	
	//设置信号灯集0号灯初始值
	unsigned int setval=1;
	if(semctl(semid,0,SETVAL,setval)<0)
	{
		ERR_MSG("semctl");
	}	
	struct sembuf sops;
	sops.sem_num =0;
	sops.sem_op = -1;//P操作
	sops.sem_flg = 0;
	while(1){
		if(semop(semid,&sops,1)<0)
		{
			ERR_MSG("semop");
		}else{
			if(0==*flag){
				sleep(1);
				printf("%s\n",p2);
				*flag=1;
			}
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值