用信号量的方式,创建两个线程 A B
1. A线程读取文件中的内容
2. B线程打印A读取到的内容到终端,
3. 全部打印完毕后,结束进程;
4. 现象类似cat一个文件
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
#include <sys/types.h>
#include <fcntl.h>
int fd;
off_t nstr=0;
sem_t sen,sem;
char str=0;
void* dy(void* arg)
{
while(1)
{
//申请信号(P操作)
if(sem_wait(&sem) < 0)
{
perror("sem_wait");
pthread_exit(NULL);
}
/*********临界区********/
printf("%c",str);
/*********临界区********/
//释放信号(V操作)
if(sem_post(&sen) < 0)
{
perror("sem_post");
pthread_exit(NULL);
}
if(nstr == *(off_t*)arg)
{
pthread_exit(NULL);
}
}
}
void* fdread(void* arg)
{
off_t len = *(off_t *)arg;
while(1)
{
//申请信号(P操作)
if(sem_wait(&sen) < 0)
{
perror("sem_wait");
pthread_exit(NULL);
}
/*********临界区********/
nstr+=sizeof(str);
lseek(fd,nstr,SEEK_SET);
if(nstr < len)
{
read(fd,&str,1);
//释放信号(V操作)
if(sem_post(&sem) < 0)
{
perror("sem_post");
pthread_exit(NULL);
}
}
else
{
read(fd,&str,1);
//释放信号(V操作)
if(sem_post(&sem) < 0)
{
perror("sem_post");
pthread_exit(NULL);
}
pthread_exit(NULL);
}
/*********临界区********/
}
}
int main(int argc, const char *argv[])
{
fd = open(argv[1],O_RDONLY);
if(fd < 0)
{
perror("open");
return -1;
}
off_t size = lseek(fd,0,SEEK_END);
//创建并初始化信号(信号灯)
if(sem_init(&sen,0,1) < 0)
{
perror("sem_init");
return -1;
}
printf("sen信号创建完毕!!\n");
if(sem_init(&sem,0,0) < 0)
{
perror("sem_init");
return -1;
}
printf("sem信号创建完毕!!\n");
pthread_t tid,pid;
if(pthread_create(&tid,NULL,fdread,(void *)&size) != 0)
{
perror("pthread_create");
return -1;
}
printf("分支线程tid创建成功!!\n");
if(pthread_create(&pid,NULL,dy,(void*)&size) != 0)
{
perror("pthread_create");
return -1;
}
printf("分支线程pid创建成功!!\n");
pthread_join(tid,NULL);//阻塞tid
pthread_join(pid,NULL);//阻塞pid
//销毁信号
sem_destroy(&sen);
sem_destroy(&sem);
close(fd);
return 0;
}