代码
#include <stdio.h>
#include <pthread.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include<semaphore.h>
//初始化信号量
sem_t sem1;
sem_t sem2;
FILE *fd_r;
char buf[20]="";
size_t res = 0;
void *func1(void *arg)
{
while(1)
{
/* 临界区 */
if(sem_wait(&sem1) < 0)
{
perror("sem_wait");
return NULL;
}
res = fread(buf,1,sizeof(buf),fd_r);
if(sem_post(&sem2) < 0)
{
perror("sem_post");
return NULL;
}
/* 临界区 */
if(res < 1)
break;
}
pthread_exit(NULL);
}
void *func2(void *arg)
{
while(1)
{
/* 临界区 */
if(sem_wait(&sem2) < 0)
{
perror("sem_wait");
return NULL;
}
fwrite(buf,1,res,stdout);
if(sem_post(&sem1) < 0)
{
perror("sem_post");
return NULL;
}
/* 临界区 */
if(res < 1)
break;
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
if(sem_init(&sem1,0,1) < 0)
{
perror("sem_init");
return -1;
}
if(sem_init(&sem2,0,0) < 0)
{
perror("sem_init");
return -1;
}
fd_r = fopen(argv[1],"r");
if(NULL == fd_r)
{
perror("fopen");
return -1;
}
//创建一个线程用于读取文件中内容
pthread_t tid1;
if(pthread_create(&tid1,NULL,func1,NULL) != 0)
{
fprintf(stderr,"pthread_create failed\n");
return -1;
}
//创建另一个线程用于将第一个线程中读取到的数据打印到终端上
pthread_t tid2;
if(pthread_create(&tid2,NULL,func2,NULL) != 0)
{
fprintf(stderr,"pthread_create failed\n");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
//关闭文件
fclose(fd_r);
//销毁信号量
sem_destroy(&sem1);
sem_destroy(&sem2);
return 0;
}
执行结果
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)