IO 利用信号量实现类似cat命令操作

1.一个线程读取文件,一个线程打印到终端

sem1,sem2初始值分别为1,0 

线程A控制申请信号量sem1,释放信号量sem2,线程B控制申请信号量sem2,释放信号量sem1.

sem_wait(&sem1)--->sem1=0     A之后阻塞

sem_post(&sem2)--->sem2=1   B准备申请信号量

sem_wait(&sem2)----->sem2=0  B之后阻塞

sem_post(&sem1)----->sem1=1  A准备申请信号量

sem_t sem1;
sem_t sem2;
char c;
void* Aread(void *arg){

	int fd=((int *)arg)[0];
	int size=((int *)arg)[1];
	int res=0;
	for(int i=0;i<size;i++){
		if(sem_wait(&sem1)<0){
			perror("sem1_wait");
			return NULL;
		}
		read(fd,&c,1);
		

		if(sem_post(&sem2)<0){
			perror("sem2_post");
			return NULL;
		}


	}
}

void* Bprint(void *arg){

	int size=((int *)arg)[1];
	for(int i=0;i<size;i++){
	if(sem_wait(&sem2)<0){
		perror("sem2_wait");
		return NULL;
	}

	printf("%c",c);
	if(sem_post(&sem1)<0){
		perror("sem1_post");
		return NULL;
	}
	}
} 
void test_cat(char *path){
	int fd=open(path,O_RDONLY);
	if(fd<0){                    //打开要读取的文件
		perror("open");
		return;
	}
	struct stat s;
	stat(path,&s);
	int arg[10];
	arg[0]=fd;
	arg[1]=s.st_size;

	if(sem_init(&sem1,0,1)!=0){  //信号量1  
		perror("sem1_init");
		return;
	}

	if(sem_init(&sem2,0,0)!=0){ //信号量2
		perror("sem2_init");
		return;
	}	

	pthread_t A;  //读取文件
	pthread_t B;   //打印到终端

	if(pthread_create(&A,NULL,Aread,(void *)arg)!=0){
		perror("A_pthread_create");
		return;
	}
	if(pthread_create(&B,NULL,Bprint,(void *)arg)!=0){
		perror("B_pthread_create");
		return;
	}

	pthread_join(A,NULL);
	pthread_join(B,NULL);
	sem_destroy(&sem1);
    sem_destroy(&sem2);
	close(fd);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值