Advertisement
YellowAfterlife

Unix, взаимодействие процессов, 1 вариант

May 4th, 2012
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.65 KB | None | 0 0
  1. /*
  2. Задание: Неименованные каналы. Поменять местами соседние строки (1-ю со 2-ой, 3-ю с 4-ой и т.д.).
  3. Сборка:
  4. gcc app.c -o app.out
  5. gcc swap.c -o swap.out
  6. ./app.out
  7. */
  8. /// app.c:
  9. #include <stdio.h>
  10. #include <unistd.h>
  11.  
  12. #define r 0                     //конец канала для чтения
  13. #define w 1                     //конец канала для записи
  14.  
  15. int fd;                     //дескриптор файла с данными
  16. int pid;                            //идентификатор процесса
  17. int p[2],q[2];              //массивы дескрипторов для каналов
  18. int total;                          //общее кол-во символов
  19. char buff[1];                       //буфер для чтения и записи
  20. int n;                      //количество прочитанных байт
  21. FILE *fp;                                   //поток fp
  22.  
  23. int main(void)
  24. {
  25.     pipe(p);                        //создаём канал с дескриптором р
  26.     pipe(q);                        //создаём канал с дескриптором q
  27.     pid=fork();                         //порождаем процесс
  28.     switch(pid)
  29.     {
  30.     case -1: // ошибка
  31.         perror("\n\tError in fork()");
  32.         return 0;
  33.     case 0: // дочерний процесс
  34.         // закрываем концы каналов:
  35.         close(p[w]);
  36.         close(r);
  37.         // дублируем конец канала Р(чтение) на стд. ввод:
  38.         dup(p[r]);
  39.         close(p[r]);
  40.         close(q[r]);
  41.         // дублируем конец канала Q(запись) на стд. вывод:
  42.         dup(q[w]);
  43.         // закрываем конец канала Q(запись):
  44.         close(q[w]);
  45.         // выполняем программу обмена строк:
  46.         if(execl("swap.out", "swap.out", 0) == -1) perror("\n\tError in execl()");
  47.         return 0;
  48.     default: // родительский процесс
  49.         // закрываем концы каналов:
  50.         close(p[r]);            //закрываем конец канала р[0] (чтение)
  51.         close(q[w]);            //закрываем конец канала q[1] (запись)
  52.         // открываем поток канала p[1](запись):
  53.         fp = fdopen(p[w],"w");
  54.         // открываем файл данных:
  55.         fd = open("data.txt", 0);
  56.         if(fd == -1) {
  57.             perror("\n\tError in open()");
  58.             return 0;
  59.         }
  60.         // читаем из файла символы пока не дойдём до конца файла:
  61.         while((n = read(fd, buff, sizeof(buff)) > 0) && (buff[0] != EOF)) {
  62.             putc(buff[0], fp); //записываем символ в конец канала p[1]
  63.             printf("%c", buff[0]); //выводим символ на экран
  64.         }
  65.         fclose(fp); //закрываем поток конца канала p[1]
  66.         close(r); //закрываем стандартный ввод
  67.         dup(q[r]); //дублируем канала q[0](чтение) на стандартный ввод
  68.         close(q[r]); //закрываем конец канала q[0]
  69.     }
  70.     return 0;
  71. }
  72.  
  73. /// swap.c:
  74. #include <stdio.h>
  75. #include <string.h>
  76. char line1[256], line2[256];
  77. int len1 = 0, len2 = 0, lind = 0;
  78. char next;
  79. void main(void) {
  80.     FILE* f = fopen("result.txt", "w");
  81.     for (next = getchar(); next != EOF; next = getchar()) {
  82.         if (next == '\r' || next == '\n') {
  83.             if (lind == 0) {
  84.                 lind = 1;
  85.             } else {
  86.                 lind = 0;
  87.                 line1[len1] = 0;
  88.                 line2[len2] = 0;
  89.                 fprintf(f, "%s\n%s\n", line2, line1);
  90.                 len1 = len2 = 0;
  91.             }
  92.         } else {
  93.             if (lind == 0) {
  94.                 line1[len1++] = next;
  95.             } else {
  96.                 line2[len2++] = next;
  97.             }
  98.         }
  99.     }
  100.     if (lind == 1) {
  101.         line1[len1] = 0;
  102.         fprintf(f, "%s\n", line1);
  103.     }
  104.     fclose(f);
  105.     printf("File processed, lines swapped.\nResult is in 'result.txt'\n");
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement