Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.47 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <fcntl.h>
  5. #include <signal.h>
  6. #include <sys/stat.h>
  7. #include <unistd.h>
  8. #include <sys/wait.h>
  9. #include <sys/types.h>
  10. #include <sys/uio.h>
  11. #include <ctype.h>
  12.  
  13. #define _GNU_SOURCE
  14.  
  15. void invertion(char* strinv);
  16. void casechanger(char* strcase);
  17. void koi8er(char* strkoi);
  18. void swapper(char* strswp);
  19. void sigcatch(int);
  20. int flag;
  21.  
  22. //Функции обработки строки для процесса 1.
  23.  
  24. void invertion(char* strinv){  // Инверсия строки.
  25.     int len = strlen(strinv);
  26.     for (int pos = 2; pos - 2 < (len - 2) / 2; pos++) {
  27.         char res = strinv[pos];
  28.         strinv[pos] = strinv[len - 1 - (pos - 2)];
  29.         strinv[len - 1 - (pos - 2)] = res;
  30.     }
  31. }
  32.  
  33. void koi8er(char* strkoi) {  // Перевод строки в koi8.
  34.     int len = strlen(strkoi);
  35.     for (int dig = 0; dig < len; dig++) {
  36.         if (strkoi[dig] >= 'a' && strkoi[dig] <= 'z') {
  37.             strkoi[dig] += 96;
  38.         } else  {
  39.             strkoi[dig] += 160;
  40.         }
  41.     }
  42. }
  43.  
  44. void swapper(char* strswp) {  // Перестановка соседних символов строки.
  45.     int swplen = strlen(strswp);
  46.     for (int pl = 1; pl < swplen / 2; pl++) {
  47.         char swp = strswp[2 * pl];
  48.         strswp[2 * pl] = strswp[2 * pl + 1];
  49.         strswp[2 * pl + 1] = swp;
  50.     }
  51. }
  52.  
  53.  // Функции обработки строки для Процесса 2.
  54. void casechanger(char* strcase) {  // Функция управления регистром букв в строке.
  55.     int len = strlen(strcase);
  56.     switch (strcase[1]) {
  57.         case '1':
  58.             for (int ch = 0; ch < len; ch++) {
  59.                 strcase[ch] = toupper(strcase[ch]);
  60.             }
  61.             break;
  62.  
  63.         case '2':
  64.             for (int ch = 0; ch < len; ch++) {
  65.                 strcase[ch] = tolower(strcase[ch]);
  66.             }
  67.             break;
  68.  
  69.         case '3':
  70.             for (int ch = 0; ch < len; ch++)
  71.                 if (toupper(strcase[ch]) == strcase[ch]) {
  72.                     strcase[ch] = tolower(strcase[ch]);
  73.                 } else {
  74.                     strcase[ch] = toupper(strcase[ch]);
  75.                 }
  76.             break;
  77.  
  78.     }
  79. }
  80.  
  81. void sigcatch(int sig) {  // Функция перехвата сигнала прерывания для ввода команд.
  82.     signal(SIGINT, sigcatch);
  83.  
  84.     printf("\n\t////////////////////////////////////\n");
  85.     printf("\n\tEnter the type of string alteration.\n");
  86.     printf("%s%s%s%s%s",
  87.             "Commands for Tier 1 alteration :\n\t",
  88.             "/def1 - string is not altered;\n\t",
  89.             "/invert - invert the string;\n\t",
  90.             "/swap - swap nearby pairs of symbols in string;\n\t",
  91.             "/koi8 - convertion to koi-8.\n"
  92.             );
  93.     printf("%s%s%s%s%s",
  94.             "Commands for Tier 2 alteration :\n\t",
  95.             "/def2 - string is not altered;\n\t",
  96.             "/upreg - make all characters in upper case;\n\t",
  97.             "/lowreg - make all characters inlower case\n\t" ,
  98.             "/swreg - swap the register of each character;\n"
  99.             );
  100.     printf("\n\t////////////////////////////////////\n");
  101.  
  102.     char cmnd[10];
  103.     scanf("%s", cmnd);
  104.     if (!strcmp(cmnd, "/def1")) {
  105.         flag %= 10;
  106.         printf("\tDefault 1\n");
  107.         return;
  108.     }
  109.  
  110.     if (!strcmp(cmnd, "/invert")) {
  111.         flag = flag % 10 + 10;
  112.         printf("\tInvert str\n");
  113.         return;
  114.     }
  115.  
  116.     if (!strcmp(cmnd, "/swap")) {
  117.         flag = flag % 10 + 20;
  118.         printf("\tSwap Sym\n");
  119.         return;
  120.     }
  121.  
  122.     if (!strcmp(cmnd, "/koi8")) {
  123.         flag = flag % 10 + 30;
  124.         printf("\tKoi-8\n");
  125.         return;
  126.     }
  127.  
  128.     if (!strcmp(cmnd, "/def2")) {
  129.         flag = (flag / 10) * 10;
  130.         printf("\tDefault 2\n");
  131.         return;
  132.     }
  133.  
  134.     if (!strcmp(cmnd, "/upreg")) {
  135.         flag = (flag / 10) * 10 + 1;
  136.         printf("\tUp Reg\n");
  137.         return;
  138.     }
  139.  
  140.     if (!strcmp(cmnd, "/lowreg")) {
  141.         flag = (flag / 10) * 10 + 2;
  142.         printf("\tLow Reg\n");
  143.         return;
  144.     }
  145.  
  146.     if (!strcmp(cmnd, "/swreg")) {
  147.         flag = (flag / 10) * 10 + 3;
  148.         printf("\tSwap Reg\n");
  149.         return;
  150.     }
  151.  
  152.     if (!strcmp(cmnd, "/out")) {
  153.         flag = 44;
  154.         printf("\tExit\n");
  155.         return;
  156.     }
  157.     printf("\tCommand not found\n");
  158. }
  159.  
  160. int main(int argc, char *argv[])
  161. {
  162.     int pipefd[2];
  163.     int pipemy[2];
  164.     pid_t pid0 = getpid(), pid1, pid2, ppid;
  165.  
  166.     if (pipe(pipefd) == -1) {  // Создание канала Процесс 0-Процесс 1.
  167.         perror("pipe");
  168.         exit(EXIT_FAILURE);
  169.     }
  170.  
  171.     pid1 = fork();  // Порождение Процесса 1.
  172.     if (pid1 == -1) {
  173.         perror("fork");
  174.         exit(EXIT_FAILURE);
  175.     }
  176.  
  177.     if (getppid() == pid0) {
  178.         if (pipe(pipemy) == -1) {  // Создание канала Процесс 1-Процесс 2.
  179.             perror("pipe");
  180.             exit(EXIT_FAILURE);
  181.         }
  182.  
  183.         pid2 = fork();  // Порождение Процесса 2.
  184.         if (pid2 == -1) {
  185.              perror("fork");
  186.              exit(EXIT_FAILURE);
  187.         }
  188.     }
  189.     ppid = getppid();
  190.  
  191.     int i = 0;
  192.     if ((getpid() != pid0) && pid2)
  193.     {
  194.         close(pipefd[1]);
  195.         close(pipemy[0]);
  196.         signal(SIGINT, SIG_IGN);
  197.         while(1) {
  198.             char buf[50];
  199.             i = 0;
  200.             // Процесс 1 усыпляет себя до тех пор, пока его не пробудит Процесс 0.
  201.             kill(getpid(), SIGSTOP);
  202.  
  203.             do {
  204.                 read(pipefd[0], buf + i, 1);
  205.                 i++;
  206.             } while (buf[i - 1] != '\n');
  207.  
  208.             buf[i] = '\0';
  209.  
  210.             switch(buf[0]) { // Выявление способа обработки строки по коду в ней.
  211.                 case '1':
  212.                     invertion(buf);
  213.                     break;
  214.  
  215.                 case '2':
  216.                     swapper(buf);
  217.                     break;
  218.  
  219.                 case '3':
  220.                     koi8er(buf);
  221.                     break;
  222.  
  223.                 default:
  224.                     break;
  225.             }
  226.  
  227.             int m = 2;
  228.             int len_buf = strlen(buf);
  229.             write(1,"\tProc 1 : ", 11);
  230.             write(1, buf, len_buf);
  231.             printf("\n");
  232.             buf[i - 1] = '\n';
  233.             // После передачи в канал обработанной строки Процесс 1 пробуждает Процесс 2.
  234.             write(pipemy[1], buf, i );
  235.             kill(pid2, SIGCONT);
  236.         }
  237.         _exit(EXIT_SUCCESS);
  238.     }
  239.     else
  240.     if ((getpid() != pid0) && (!pid2))
  241.     {
  242.         close(pipefd[0]);
  243.         close(pipefd[1]);
  244.         close(pipemy[1]);
  245.         signal(SIGINT, SIG_IGN);
  246.         while(1)
  247.         {
  248.             i = 0;  // Процесс 2 усыпляет себя в ожидании строки от Процесса 1.
  249.             char final[50];
  250.             kill(getpid(), SIGSTOP);
  251.  
  252.  
  253.             do {
  254.                 read(pipemy[0], final + i, 1);
  255.                 i++;
  256.             } while (final[i - 1] != '\n');
  257.  
  258.  
  259.             final[i] = '\0';
  260.             casechanger(final);
  261.             i = 2;
  262.             int len_final = strlen(final);
  263.             write(1,"\tProc 2 : ", 11);
  264.             write(1, final, len_final);
  265.             printf("\n");
  266.         }
  267.     }
  268.  
  269.  
  270.      else
  271.         { //beginnig of work
  272.         char inputer[50];
  273.         close(pipefd[0]);
  274.         signal(SIGINT, sigcatch);
  275.         printf("Enter the string to alt it in different ways:\n");
  276.         inputer[0] = inputer[1] = '0';
  277.         while (1)
  278.         {
  279.             i = 2;
  280.             do {
  281.                 read(0, inputer + i, 1);
  282.                 i++;
  283.             } while (inputer[i - 1] != '\n');
  284.             char transl;
  285.             for (int m = 0; m < 2; m++)
  286.             {
  287.                 if (!m) {
  288.                     transl = flag / 10;
  289.                 } else {
  290.                     transl = flag % 10;
  291.                 }
  292.                  switch (transl) {
  293.                     case 0:
  294.                         inputer[m] = '0';
  295.                         break;
  296.  
  297.                     case 1:
  298.                         inputer[m] = '1';
  299.                         break;
  300.  
  301.                     case 2:
  302.                         inputer[m] = '2';
  303.                         break;
  304.  
  305.                     case 3:
  306.                         inputer[m] = '3';
  307.                         break;
  308.  
  309.                     default:
  310.                         printf("bye ...");
  311.                         break;
  312.                 }
  313.             }
  314.             if (flag == 44) {
  315.                 printf("\tExiting...\n\n");
  316.                 kill(pid1,SIGTERM);
  317.                 kill(pid2, SIGTERM);
  318.                 return 0;
  319.             }
  320.             inputer[i - 1] = '\0';
  321.             write(1,"\tProc 0 : ", 11);
  322.             int len_inputer = strlen(inputer);
  323.             write(1, inputer, len_inputer);
  324.             printf("\n");
  325.             inputer[i - 1] = '\n';
  326.             write(pipefd[1], inputer, i);
  327. // Процесс 0 пробуждает процесс 1 после отправки ему строки для обработки.
  328.             kill(pid1, SIGCONT);
  329.         }
  330.         wait(NULL);
  331.         exit(EXIT_SUCCESS);
  332.  
  333.     }
  334.     return 0;
  335. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement