实现代码:
//要求创建两个线程,实现文件打印到终端上,类似cat一个文件:
//A线程读取文件中的内容
//B线程将A线程中读取到的数据打印到终端上
//当文件打印完毕后,结束进程。
#include<stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
char str[10]="";
sem_t sem; //信号灯
sem_t sem1;
off_t res=0; //读取值
//A线程
void * callback1(void* arg)
{
int pr=*(int*)arg; //接受指针地址
while(1) //循环读取
{
sem_wait(&sem1); //信号灯P操作进入临界区
res=read(pr,str,sizeof(str)); //读取文件内容
if(res<0)
{
perror("read");
_exit(1);
}
if(0==res) //文件读取结束后,V操作退出临界区,防止死锁
{
sem_post(&sem);
break;
}
sem_post(&sem); //V操作退出临界区
}
pthread_exit(NULL); //线程结束
}
//B线程
void * callback2(void *arg)
{
while(1)
{
sem_wait(&sem); //P操作进入临界区
if(0==res)
{
sem_post(&sem1); //同理退出循环要V操作,否则下面的代码执行不到,会死锁阻塞
break;
}
if(write(1,str,res)<0) //打印数据到终端
{
perror("read");
_exit(1);
}
sem_post(&sem1); //V操作
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
sem_init(&sem,0,1); //创建两个信号等
sem_init(&sem1,0,1);
int pr=open("./1.c",O_RDONLY); //打开一个只读文件
if(pr<0)
{
perror("open");
}
printf("文件打开成功\n");
sem_wait(&sem); //主程序P操作,先执行读取线程
//创建两个线程
pthread_t tid1,tid2;
if(pthread_create(&tid1,NULL,callback1,&pr)!=0)
{
perror("pthread_creat");
return -1;
}
if(pthread_create(&tid2,NULL,callback2,NULL)!=0)
{
perror("pthread_creat");
return -1;
}
pthread_join(tid1,NULL); //阻塞等待两个线程执行结束
pthread_join(tid2,NULL);
sem_destroy(&sem); //销毁信号灯
sem_destroy(&sem1);
return 0;
}
实现效果: