#include <stdio.h>
#include <semaphore.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
char a;
int ret;
int fd;
sem_t sem,sem2;
void *call1(void* arg)
{
while(1)
{
/**********/
if(sem_wait(&sem)<0)
{
perror("sem_wait");
pthread_exit(NULL);
}
ret=read(fd,&a,1);
if(ret==0)
{
printf("读取完毕\n");
sem_post(&sem2);
pthread_exit(NULL);
}
if(sem_post(&sem2)<0)
{
perror("sem_post");
pthread_exit(NULL);
}
/**********/
}
}
void *call2(void* arg)
{
while(1)
{
/***********/
if(sem_wait(&sem2)<0)
{
perror("sem_wait");
pthread_exit(NULL);
}
if(ret==0)
{
printf("call2退出\n");
pthread_exit(NULL);
}
fprintf(stderr,"%c",a);
if(sem_post(&sem)<0)
{
perror("sem_post");
pthread_exit(NULL);
}
/************/
}
}
int main(int argc, const char *argv[])
{
if(sem_init(&sem,0,1)<0)
{
perror("sem_init");
return -1;
}
if(sem_init(&sem2,0,0)<0)//创建并初始化信号量
{
perror("sem_init");
return -1;
}
fd=open(argv[1],O_RDONLY);//打开读文件
if(fd<0)
{
perror("open");
return -1;;
}
pthread_t tid1,tid2;//创建两个线程
if(pthread_create(&tid1,NULL,call1,NULL)!=0)
{
perror("pthread_create");
return -1;
}
if(pthread_create(&tid2,NULL,call2,NULL)!=0)
{
perror("pthread_create");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);//阻塞等待线程结束
sem_destroy(&sem);//销毁信号量
sem_destroy(&sem2);
close(fd);//关闭读文件
return 0;
}
代碼實現: