要求创建两个线程,实现文件打印到终端上,类似cat一个文件:
1.A线程读取文件中的内容
2.B线程将A线程中读取到的数据打印到终端上
3.当文件打印完毕后,结束进程。
代码:
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
char str[100]="";
sem_t sem_A,sem_B;
int flag=0;
int res=0;
void* call_back_A(void* A){
//打开文件
int fd=open("./str.c",O_RDONLY);
off_t offset=0;
while(1){
//申请A信号量 P操作
if(sem_wait(&sem_A)<0){
perror("sem_wait");
return NULL;
}
lseek(fd,offset,SEEK_SET);
//每次循环将数组置'\0'
bzero(str,sizeof(str));
//从文件读取数据到数组
res=read(fd,str,sizeof(str));
if(res<0){
perror("read");
return NULL;
}else if(res==0){
flag=1;
sem_post(&sem_B);
break;
}
offset=lseek(fd,0,SEEK_CUR);
//释放B信号量 V操作
if(sem_post(&sem_B)<0){
perror("sem_post");
return NULL;
}
}
close(fd);
//退出线程
pthread_exit(NULL);
}
void* call_back_B(void* B){
while(1){
//申请A信号量 P操作
if(sem_wait(&sem_B)<0){
perror("sem_wait");
return NULL;
}
//输出到终端
write(1,str,res);
if(flag==1){
sem_post(&sem_A);
break;
}
//释放B信号量 V操作
if(sem_post(&sem_A)<0){
perror("sem_post");
return NULL;
}
}
//退出线程
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//定义两个信号量,一个为sem_A,一个为sem_B
if(sem_init(&sem_A,0,1)<0){
perror("sem_init");
return -1;
}
if(sem_init(&sem_B,0,0)<0){
perror("sem_init");
return -1;
}
//定义线程
pthread_t tid_A,tid_B;
if(pthread_create(&tid_A,NULL,call_back_A,NULL)<0){
fprintf(stderr,"pthread_create failed\n");
}
if(pthread_create(&tid_B,NULL,call_back_B,NULL)<0){
fprintf(stderr,"pthread_create failed\n");
}
//分离线程
pthread_detach(tid_A);
//回收退出的线程,如果线程未退出,用来阻塞线程
pthread_join(tid_B,NULL);
//销毁信号量
sem_destroy(&sem_A);
sem_destroy(&sem_B);
return 0;
}
运行结果: