#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
char arr[128];
sem_t sem;
struct func1{
off_t size;
int fd;
};
void* A(void * arg)
{
int i=0;
lseek(((struct func1*)arg)->fd,0,SEEK_SET);
for(i=0;i<((struct func1*)arg)->size;i++){
sem_wait(&sem);
ssize_t p;
p=read(((struct func1*)arg)->fd,&arr[i],1);
printf("%c",arr[i]);
sem_post(&sem);
}
}
void* B(void *arg)
{
if(strlen(arr)){
int i=0;
for(i=0;i<((struct func1*)arg)->size;i++){
sem_wait(&sem);
printf("%c",arr[i]);
sem_post(&sem);
}
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
if(sem_init(&sem,0,1)!=0)
{
perror("sem_init");
return -1;
}
int fd=open(argv[1],O_RDONLY);
if(fd<0){
perror("open");
return -1;
}
pthread_t tid1,tid2;
struct func1 p;
p.size=lseek(fd,0,SEEK_END);
p.fd=fd;
if(pthread_create(&tid1,NULL,A,(void*)&p)!=0)
{
perror("pthread_create");
return -1;
}
if(pthread_create(&tid2,NULL,B,(void*)&p)!=0)
{
perror("pthread_create");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
sem_destroy(&sem);
close(fd);
exit(0);
return 0;
}