#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
#include <semaphore.h>
//信号量
sem_t sem1, sem2;
char str[20] = "";
//从文件中读取数据
void* callBack_read(void* arg)
{
//以读的方式打开源文件 open
int fd = open("./1_pthread_create.c", O_RDONLY);
if(fd < 0)
{
perror("open");
goto END;
}
while(1)
{
//p:sem1
sem_wait(&sem1);
bzero(str, sizeof(str));
//读取数据:注意要读取一次后,叫醒打印线程
if(read(fd, str, sizeof(str)-1) == 0)
{
pthread_cancel(*(pthread_t*)arg);
break;
}
//v:sem2
sem_post(&sem2);
}
printf("读取完毕\n");
close(fd);
END:
pthread_exit(NULL);
}
//打印线程
void* callBack_write(void* arg)
{
//循环打印读线程读取到的内容
while(1)
{
//p:sem2
sem_wait(&sem2);
//注意打印完后,要叫醒读线程,并且当前线程需要阻塞等待被叫醒;
printf("%s", str);
fflush(stdout);
//v:sem1
sem_post(&sem1);
}
printf("打印完毕\n");
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;
}
//创建两个线程
pthread_t tid_r,tid_w;
if(pthread_create(&tid_r, NULL, callBack_read, &tid_w) != 0)
{
perror("pthread_create");
return -1;
}
if(pthread_create(&tid_w, NULL, callBack_write, NULL) != 0)
{
perror("pthread_create");
return -1;
}
//阻塞等待线程退出
pthread_join(tid_r, NULL);
pthread_join(tid_w, NULL);
//销毁信号量
sem_destroy(&sem1);
sem_destroy(&sem2);
return 0;
}