Advertisement
Rainbow_Helicopter

Комиссия по Си. Задание #2. The Grandson and Great-Grandson

Jan 14th, 2013
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.33 KB | None | 0 0
  1. //~ Связать внука и правнука (находящихся на различных "родственных" линиях) каналами.
  2. //~ Внук передает правнуку текстовую строку, в которой находится имя файла.
  3. //~ Правнук принимает строку, открывает файл, определяет его длину в байтах и возвращает это значение внуку.
  4. //~ Внук принимает значение размера файла и печатает его
  5. //~ ----------------------------------------------------
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <unistd.h>
  10. #include <sys/types.h>
  11. #include <fcntl.h>
  12. #include <string.h>
  13.  
  14. #define CloseP close(GtoGG[0]); close(GtoGG[1]); close(GGtoG[0]); close(GGtoG[1]);
  15. #define St_Wait int status; wait(&status);
  16.  
  17. int main(int argc,char**argv)
  18. {
  19.     int GtoGG[2],GGtoG[2]; //каналы передачи данных внук->правнук и правнук->внук
  20.    
  21.     pipe(GtoGG);
  22.     pipe(GGtoG);
  23.     if (fork())
  24.         if (fork()) // предок
  25.         {
  26.             int status;
  27.             wait(&status);
  28.             wait(&status);
  29.             CloseP
  30.             return 0;
  31.         }
  32.         else // ветвь 1: --> внук
  33.             if (fork()) // сын 1
  34.                 {
  35.                     St_Wait
  36.                     CloseP
  37.                     exit(0);
  38.                 }
  39.             else // внук 1
  40.             {
  41.                 char*sName;
  42.                 char c;
  43.                 int i,rL;
  44.                
  45.                 // читаем строку
  46.                 printf("Название файла:\n");
  47.                 for(i=0; ((c=getchar())!='\n'); i++)
  48.                     sName[i]=c;
  49.                 sName[i]='\0';
  50.                
  51.                 write(GtoGG[1],&i,sizeof(i));
  52.                 // отправляем размер строки
  53.                 write(GtoGG[1],sName,i*sizeof(char));
  54.                 // отправляем ссылку (поэтому без &) на строку,
  55.                 // причем размер равен длине строки
  56.                
  57.                 read(GGtoG[0],&rL,sizeof(rL) );
  58.                 // читаем полученный размер файла
  59.                
  60.                 if (rL!=-1)
  61.                     printf("Размер файла в байтах=%d\n",rL);
  62.                 else
  63.                     printf("Ошибка чтения файла\n");
  64.                
  65.                 CloseP
  66.                 exit(0);
  67.             }
  68.     else // ветвь 2: --> правнук
  69.         if (fork()) // сын 2
  70.         {
  71.             St_Wait
  72.             CloseP
  73.             exit(0);
  74.         }
  75.         else // внук 2
  76.             if (fork()) // внук 2
  77.                 {
  78.                     St_Wait
  79.                     CloseP
  80.                     exit(0);
  81.                 }
  82.             else // правнук 2
  83.             {
  84.                
  85.                 FILE*FP;
  86.                 char*rName;
  87.                 int rNameL,Length;
  88.                
  89.                 read(GtoGG[0],&rNameL,sizeof(rNameL));
  90.                 // читаем полученный размер строки
  91.                
  92.                 rName=(char*)malloc(2*rNameL*sizeof(char));
  93.                 // выделяем память для записи строки
  94.                 read(GtoGG[0],rName,rNameL*sizeof(char));
  95.                 // читаем строку, причем размер равен длине строки
  96.                
  97.                 if ((FP=fopen(rName,"r"))!=NULL) // открываем файл
  98.                 {
  99.                     fseek(FP,0,SEEK_END);
  100.                     // передвигаем указатель на конец
  101.                     Length=ftell(FP);
  102.                     // ftell возвращает смещение от начала файла
  103.                     fclose(FP);
  104.                    
  105.                     write(GGtoG[1],&Length,sizeof(Length));
  106.                 }
  107.                 else
  108.                 {
  109.                     Length=-1;
  110.                     write(GGtoG[1],&Length,sizeof(Length));
  111.                 }
  112.                
  113.                 free(rName);
  114.                 CloseP
  115.                 exit(0);
  116.             }
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement