用信号量的方式,创建两个线程 A B
A线程读取文件中的内容
B线程打印A读取到的内容到终端,
全部打印完毕后,结束进程;
现象类似cat一个文件
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
struct sem_file_strcut
{
char arr[5];
sem_t *sem1;
FILE* fd1;
sem_t *sem2;
char *ptr;
};
void * func_read(void * pp)
{
struct sem_file_strcut*p=(struct sem_file_strcut*)pp;
while(1)
{
sem_wait(p->sem1);
p->ptr=fgets(p->arr,2,p->fd1);
if(p->ptr==NULL)
{
sem_post(p->sem2);
break;
}
sem_post(p->sem2);
}
pthread_exit(NULL);
}
void *func_print(void * pp)
{
struct sem_file_strcut*p=(struct sem_file_strcut*)pp;
while(1)
{
sem_wait(p->sem2);
if(p->ptr==NULL)
{
sem_post(p->sem1);
break;
}
fputs(p->arr,stdout);
fflush(stdout);
sem_post(p->sem1);
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
FILE *fd;
sem_t sem,sem3;
struct sem_file_strcut sem_file;
fd=fopen("./cat.c","r");
if (fd==NULL)
{
perror("fopen");
return -1;
}
sem_file.fd1=fd;
if (sem_init(&sem,0,1)!=0)
{
perror("sem_init");
return -1;
}
sem_file.sem1=&sem;
if (sem_init(&sem3,0,0)!=0)
{
perror("sem3");
return -1;
}
sem_file.sem2=&sem3;
pthread_t pt_1;
if (pthread_create(&pt_1,NULL,func_read,(void*)&sem_file)!=0)
{
perror("pt_1");
return -1;
}
pthread_t pt_2;
if (pthread_create(&pt_2,NULL,func_print,(void *)&sem_file)!=0)
{
perror("pt_2");
return -1;
}
pthread_join(pt_1,NULL);
pthread_join(pt_2,NULL);
sem_destroy(&sem);
sem_destroy(&sem3);
fclose(fd);
return 0;
}