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