Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //~ Связать внука и правнука (находящихся на различных "родственных" линиях) каналами.
- //~ Внук передает правнуку текстовую строку, в которой находится имя файла.
- //~ Правнук принимает строку, открывает файл, определяет его длину в байтах и возвращает это значение внуку.
- //~ Внук принимает значение размера файла и печатает его
- //~ ----------------------------------------------------
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <fcntl.h>
- #include <string.h>
- #define CloseP close(GtoGG[0]); close(GtoGG[1]); close(GGtoG[0]); close(GGtoG[1]);
- #define St_Wait int status; wait(&status);
- int main(int argc,char**argv)
- {
- int GtoGG[2],GGtoG[2]; //каналы передачи данных внук->правнук и правнук->внук
- pipe(GtoGG);
- pipe(GGtoG);
- if (fork())
- if (fork()) // предок
- {
- int status;
- wait(&status);
- wait(&status);
- CloseP
- return 0;
- }
- else // ветвь 1: --> внук
- if (fork()) // сын 1
- {
- St_Wait
- CloseP
- exit(0);
- }
- else // внук 1
- {
- char*sName;
- char c;
- int i,rL;
- // читаем строку
- printf("Название файла:\n");
- for(i=0; ((c=getchar())!='\n'); i++)
- sName[i]=c;
- sName[i]='\0';
- write(GtoGG[1],&i,sizeof(i));
- // отправляем размер строки
- write(GtoGG[1],sName,i*sizeof(char));
- // отправляем ссылку (поэтому без &) на строку,
- // причем размер равен длине строки
- read(GGtoG[0],&rL,sizeof(rL) );
- // читаем полученный размер файла
- if (rL!=-1)
- printf("Размер файла в байтах=%d\n",rL);
- else
- printf("Ошибка чтения файла\n");
- CloseP
- exit(0);
- }
- else // ветвь 2: --> правнук
- if (fork()) // сын 2
- {
- St_Wait
- CloseP
- exit(0);
- }
- else // внук 2
- if (fork()) // внук 2
- {
- St_Wait
- CloseP
- exit(0);
- }
- else // правнук 2
- {
- FILE*FP;
- char*rName;
- int rNameL,Length;
- read(GtoGG[0],&rNameL,sizeof(rNameL));
- // читаем полученный размер строки
- rName=(char*)malloc(2*rNameL*sizeof(char));
- // выделяем память для записи строки
- read(GtoGG[0],rName,rNameL*sizeof(char));
- // читаем строку, причем размер равен длине строки
- if ((FP=fopen(rName,"r"))!=NULL) // открываем файл
- {
- fseek(FP,0,SEEK_END);
- // передвигаем указатель на конец
- Length=ftell(FP);
- // ftell возвращает смещение от начала файла
- fclose(FP);
- write(GGtoG[1],&Length,sizeof(Length));
- }
- else
- {
- Length=-1;
- write(GGtoG[1],&Length,sizeof(Length));
- }
- free(rName);
- CloseP
- exit(0);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement