用信号量的方式,创建两个线程 A B
1. A线程读取文件中的内容
2. B线程打印A读取到的内容到终端,
3. 全部打印完毕后,结束进程;
4. 现象类似cat一个文件
#include <stdio.h>
#include <semaphore.h>
#include <pthread.h>
#include <sys/types.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
sem_t sem1;
sem_t sem2;
char str[5]="";
void *callback1(void *arg)//读取文件内容void *arg=(void *)&fd
{
int fd=*(int *)arg;
ssize_t r;
while(1)
{
//p操作
sem_wait(&sem1);//此时sem1=0,sem2阻塞
bzero(str,sizeof(str));
//读数据
r=read(fd,str,sizeof(str));
if(r==0)
{
bzero(str,sizeof(str));
sem_post(&sem2);//sem2=1
pthread_exit(NULL);
}
//v2操作
sem_post(&sem2);//sem2=1
}
}
void *callback2(void *arg)//打印文件内容到终端
{
int fd=*(int *)arg;
while(1)
{
//p操作
sem_wait(&sem2);//sem2=0
//输出数据到终端
if(strlen(str)==0)
{
printf("write end\n");
pthread_exit(NULL);
}
printf("%s",str);
//v操作
sem_post(&sem1);//sem1=1
}
}
int main(int argc, const char *argv[])
{
//创建并初始化信号量
if(sem_init(&sem1,0,1)!=0)
{
perror("sem");
return -1;
}
if(sem_init(&sem2,0,0)!=0)
{
perror("sem");
return -1;
}
//打开文件
int fd=open("./guer.c",O_RDONLY);
if(fd<0)
{
perror("open");
return -1;
}
//创建线程1
pthread_t tid1;
if(pthread_create(&tid1,NULL,callback1,&fd)!=0)
{
perror("pthread");
return -1;
}
//创建线程2
pthread_t tid2;
if(pthread_create(&tid2,NULL,callback2,&fd)!=0)
{
perror("pthread");
return -1;
}
//阻塞主线程
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
//销毁信号量
sem_destroy(&sem1);
sem_destroy(&sem2);
return 0;
}
//结果
ubuntu@ubuntu:1013$ gcc threadcat.c -pthread
ubuntu@ubuntu:1013$ ./a.out
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int main(int argc, const char *argv[])
{
pid_t pid=fork();
if(pid>0)
{
int i=0;
while(i<3)
{
printf("parent:pid=%d cpid=%d\n",getpid(),pid);
sleep(1);
i++;
}
}
else if(pid==0)
{
while(1)
{
printf("child:ppid=%d pid=%d\n",getppid(),getpid());
sleep(1);
}
}
else
{
perror("fork");
return -1;
}
return 0;
}
write end