Advertisement
rnort

SPO-5

Nov 23rd, 2012
380
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.63 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <dlfcn.h>
  4. #include <sys/sem.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <aio.h>
  8. #include <dirent.h>
  9. #include <fcntl.h>
  10. #include <signal.h>
  11. #include <pthread.h>
  12. #include <assert.h>
  13. #include <string.h>
  14. #include <stdlib.h>
  15.  
  16. #define BUF_S 1024
  17.  
  18. void MakeFileList();
  19. void* ReadTh(void*);
  20. void* WriteTh(void*);
  21. void ErrorPrint(char* string,int num);
  22. void clear_buf();
  23.  
  24. int (*AReadF)(struct aiocb*);
  25. int (*AWriteF)(struct aiocb*);
  26.  
  27. pthread_mutex_t r_mutex, w_mutex;
  28.  
  29. char FileList[100][256];
  30. int sem_id=0;
  31. int file_count;
  32. char buf[BUF_S];
  33. int flag=0;
  34.  
  35. struct aiocb read_cb,write_cb;
  36. int read_len=0,write_len=0;
  37.  
  38. void main()
  39. {
  40.     int i=0,j; 
  41.     pthread_t tid[2];
  42.     void *lid;
  43.     lid=dlopen("./55dll.so",RTLD_LAZY);
  44.     if(lid==NULL)
  45.         ErrorPrint("Library",0);
  46.    
  47.     AReadF=dlsym(lid,"AReadF");
  48.     AWriteF=dlsym(lid,"AWriteF");
  49.    
  50.     int res = pthread_mutex_init(&r_mutex, NULL);
  51.     if(res!=0)
  52.         ErrorPrint("Read Mutex",0);
  53.  
  54.     res = pthread_mutex_init(&r_mutex, NULL);
  55.     if(res!=0)
  56.         ErrorPrint("Write Mutex",0);
  57.    
  58.  
  59.     MakeFileList();
  60.            
  61.     printf("\nThere are next files in dir: \n");
  62.     while(FileList[i][0])
  63.     {
  64.         printf("%s\n",FileList[i]);    
  65.         i++;   
  66.     }
  67.     printf("\n");
  68.    
  69.     i=pthread_create(&tid[0],NULL,&ReadTh,NULL);
  70.     if(i!=0)
  71.         ErrorPrint("Thread",0);
  72.    
  73.     i=pthread_create(&tid[1],NULL,&WriteTh,NULL);
  74.     if(i!=0)
  75.         ErrorPrint("Thread",0);
  76.  
  77.     pthread_join (tid[0], 0);
  78.     pthread_join (tid[1], 0);
  79.  
  80.     printf("END\n");
  81.     pthread_mutex_destroy(&r_mutex);
  82.     pthread_mutex_destroy(&w_mutex);
  83.     dlclose(lid);                
  84. }
  85.  
  86.  
  87.  
  88.  
  89. void MakeFileList()
  90. {
  91.     struct dirent **namelist;
  92.     int k;
  93.     int i,j,len;
  94.    
  95.     k = scandir("./5", &namelist, 0, alphasort);
  96.     file_count=k;    
  97.    
  98.     if (k < 0)
  99.         ErrorPrint("Scandir",0);
  100.    
  101.     i=0;
  102.     while(k--)
  103.     {
  104.         len=strlen(namelist[k]->d_name);   
  105.         if(namelist[k]->d_name[0]!='.' && namelist[k]->d_name[0]!=' ')
  106.         {  
  107.             for(j=0;j<len;j++)
  108.             {  
  109.                 FileList[i][j]=namelist[k]->d_name[j];
  110.             }
  111.         }      
  112.         free(namelist[k]);
  113.         i++;
  114.     }
  115.  
  116.     free(namelist);
  117. }
  118.  
  119. void* ReadTh(void *pp)
  120. {
  121.     int fid;
  122.     char temp[256];
  123.     int i;
  124.     printf("\n-------------------work-----------------\n");
  125.  
  126.     for(i=0;i<file_count-2;i++)
  127.     {
  128.         strcpy(temp,"5");
  129.         strcat(temp,FileList[i]);
  130.  
  131.         fid=open(temp,O_RDONLY);
  132.         if(fid==-1)
  133.         {
  134.             ErrorPrint("Open File Read",1);
  135.             continue;
  136.         }
  137.        
  138.         usleep(100);
  139.         clear_buf();
  140.         read_cb.aio_fildes=fid;
  141.         read_cb.aio_offset=0;
  142.         read_cb.aio_buf=&buf;
  143.         read_cb.aio_nbytes=BUF_S;
  144.         read_cb.aio_sigevent.sigev_notify=SIGEV_NONE;
  145.        
  146.         while(1)
  147.         {
  148.             printf("\n%s read...\n",temp);
  149.            
  150.             pthread_mutex_lock(&r_mutex);
  151.             read_len=AReadF(&read_cb);
  152.             pthread_mutex_unlock(&w_mutex);
  153.            
  154.             read_cb.aio_offset+=read_len;  
  155.             printf("%s",(char*)read_cb.aio_buf);           
  156.            
  157.             if(read_len<BUF_S)
  158.                 break;
  159.         }
  160.         close(fid);
  161.     }
  162.     flag=1;
  163.    
  164.     return;
  165. }
  166.  
  167. void* WriteTh(void* pp)
  168. {
  169.     int fid;
  170.     char temp[256];
  171.     int val;
  172.  
  173.     strcpy(temp,"./res.txt");
  174.  
  175.     fid=open(temp,O_WRONLY | O_CREAT | O_APPEND | O_TRUNC);
  176.     printf("%d",fid);  
  177.     if(fid==-1)
  178.         ErrorPrint("Open Write File",0);
  179.        
  180.    
  181.     write_cb.aio_fildes=fid;
  182.     write_cb.aio_offset=0;
  183.     write_cb.aio_buf=&buf;
  184.     write_cb.aio_sigevent.sigev_notify=SIGEV_NONE;
  185.  
  186.     while(!flag)
  187.     {
  188.         printf("\t\t%s write...\n",temp);
  189.         pthread_mutex_lock(&w_mutex);
  190.         write_cb.aio_nbytes = read_len;
  191.         write_len=AWriteF(&write_cb);
  192.         pthread_mutex_unlock(&r_mutex);
  193.     }
  194.    
  195.     close(fid);
  196.     return;
  197. }
  198.  
  199. void ErrorPrint(char* string, int num)
  200. {
  201.     printf("\n%s ERROR\n",string);
  202.     if(num==0) 
  203.         exit(0);
  204. }
  205.  
  206.  
  207. void clear_buf()
  208. {
  209.     int e;
  210.  
  211.     for(e=0;e<BUF_S;e++)
  212.         buf[e]=0;
  213. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement