Advertisement
volkovich_maksim

ырудд_зшзу2

Dec 15th, 2016
403
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.22 KB | None | 0 0
  1. #include <string.h>
  2. #include <unistd.h>
  3. #include <sys/wait.h>
  4. #include <sys/types.h>
  5. #include <stdio.h>
  6. #include <errno.h>
  7. #include <ctype.h>
  8. #include "util.h"
  9. #include <stdlib.h>
  10. //#define max_prs 11
  11.  
  12. typedef struct pr_list{
  13.     char **pr_arr;
  14.     pid_t pid;
  15.     struct pr_list *next;
  16. }pr_list;
  17.  
  18. typedef struct pipe_list{
  19.     char *line;
  20.     struct pipe_list *next;
  21.     pr_list *prs;
  22. }pipe_list;
  23.  
  24. void printf_prs(char *array[]){
  25.     int i;
  26.     for (i = 0; array[i] != NULL /*&& array[i] != NULL*/; i++){
  27.         printf("%s ", array[i]);
  28.     }
  29. }
  30.  
  31. void add_pr(char *pr, char **array[]){
  32.     int i, j, len;
  33.     /*  count "non-NULL" cells  */
  34.     for (j = 0; (*array)[j] != NULL; j++);
  35.     j += 2;//j "non-NULL" + 1 "NULL" + 1 extra for a new argument
  36.     (*array) = realloc((*array), j*sizeof(char*));//36
  37.     /*  MOVE PR INTO CELL   */
  38.     for (i = 0; ((*array)[i]) != NULL && (i < j) ; i++);
  39.     len = strlen(pr);
  40.     ((*array)[i]) = calloc(len + 1, sizeof(char));
  41.     for (j = 0; j < len; j++){
  42.         ((*array)[i][j]) = pr[j];
  43.     }
  44.     ((*array)[i][j]) = '\0';
  45.     /*  NEXT CELL = NULL    */
  46.     ((*array)[i+1]) = NULL;
  47. }//49
  48.  
  49.     /*  MAIN    */
  50.  
  51. int main(int argc, char *argv[]){
  52.     int i, j, k, len, word_begin, word_end;
  53.     int status;
  54.     pid_t pid;
  55.     int not_empty, back_mode, pr_flag, error_flag;
  56.     int flag = 1, next_pr = 0;
  57.     pipe_list *c_pipe, *pipes, *p_pipe/*pointer_pipe*/;
  58.     pr_list *c_pr, *prs, *p_pr;
  59.     char *new_line, *cur_word;
  60.     printf("Please input pipe\n");
  61.     while ((new_line = getline_unlim()) != NULL){
  62.         /*  WAIT BACK PROCESSES */
  63.         if( !strcmp(new_line, "exit") || !strcmp(new_line, "EXIT") ){
  64.             printf("exit\n");
  65.             break;
  66.         }
  67.  
  68.         /* processing line, creating pipe */
  69.         if (!flag){//if pipe won't be the first one
  70.             c_pipe = c_pipe->next;
  71.         }
  72.         /*  allocate memory for current pipe    */
  73.         c_pipe = calloc(1, sizeof(pipe_list));
  74.         c_pipe->next = NULL;
  75.         c_pipe->prs = NULL;
  76.         if (flag){
  77.             pipes = c_pipe;
  78.             flag = 0;
  79.         }
  80.         /*  allocate memory for first pr in current pipe    */
  81.         c_pr = calloc(1, sizeof(pr_list));
  82.         c_pr->pr_arr = calloc(1, sizeof(char*));
  83.         c_pr->next = NULL;
  84.  
  85.         if (!strcmp(new_line,"")) continue;
  86.         len = strlen(new_line);
  87.         /*  copy new_line to current_pipe->line */
  88.         c_pipe->line = calloc(len + 1, sizeof(char));
  89.         for (i = 0; i < len + 1; i++){
  90.             c_pipe->line[i] = new_line[i];
  91.         }
  92.  
  93.         word_begin = 0; next_pr = 0; error_flag = 0;
  94.         not_empty = 0, back_mode = 0, pr_flag = 1;
  95.         for (i = 0; i < len; i++){
  96.             if (pr_flag){
  97.                 c_pipe->prs = c_pr;
  98.                 pr_flag = 0;
  99.                 not_empty = 0;
  100.             }
  101.             if (next_pr){
  102.                 c_pr->next = calloc(1, sizeof(pr_list));
  103.                 c_pr = c_pr->next;
  104.                 c_pr->pr_arr = calloc(1, sizeof(char*));
  105.                 c_pr->next = NULL;
  106.                 next_pr = 0;
  107.                 not_empty = 0;
  108.             }
  109.  
  110.             if ((!isalnum(new_line[i]) && new_line[i] != '-')){
  111.                 if (new_line[i] == '|'){
  112.                     if (!not_empty) error_flag = 1;
  113.                     next_pr = 1;
  114.                     not_empty = 0;
  115.                 }
  116.                 if (new_line[i] == '&'){
  117.                     back_mode = 1;
  118.                 }
  119.                 new_line[i] = '\0';
  120.                 word_end = i;
  121.  
  122.                 k = word_end - word_begin;
  123.                 if (k != 0){
  124.                     cur_word = malloc(sizeof(char));
  125.                     cur_word = realloc(cur_word, k);
  126.                     for (j = 0; j < k; j++){
  127.                         cur_word[j] = new_line[word_begin + j];
  128.                     }
  129.                     word_begin = i + 1;
  130.                 }
  131.                 if (word_begin != word_end){
  132.                     if (strcmp(cur_word,"")){
  133.                         if (!not_empty) not_empty = 1;
  134.                         add_pr(cur_word, &(c_pr->pr_arr));
  135.                         free(cur_word);
  136.                     }
  137.                 }
  138.             }
  139.         }
  140.         k = i - word_begin;
  141.         if (k != 0){
  142.             cur_word = malloc(sizeof(char));
  143.             cur_word = realloc(cur_word, k);
  144.             for (j = 0; j < k; j++){
  145.                 cur_word[j] = new_line[word_begin + j];
  146.             }
  147.         }
  148.         if (word_begin != i){
  149.             if (strcmp(cur_word,"")){
  150.                 if (!not_empty) not_empty = 1;
  151.                 add_pr(cur_word, &(c_pr->pr_arr));
  152.                 free(cur_word);
  153.             }
  154.         }
  155.  
  156. /*      if (c_pipe->prs){
  157.             if (c_pipe->prs->pr_arr)Х{
  158.                 printf_prs(c_pipe->prs->pr_arr);
  159.                 printf("\n");
  160.             }
  161.             while (c_pipe->prs->next){
  162.                 c_pipe->prs = c_pipe->prs->next;
  163.                 printf_prs(c_pipe->prs->pr_arr);
  164.                 printf("\n");
  165.             }
  166.         }
  167. */
  168.  
  169.         /*  executing pipe  */
  170.             if (error_flag){
  171.                 printf("pipe was written incorrectly\n");
  172.  
  173.             /*  free(c_pipe->line);
  174.                 p_pr = c_pipe->prs;
  175.                 while (p_pr){
  176.                     for (i = 0; p_pr->pr_arr[i] != NULL; i++){
  177.                         free(p_pr->pr_arr[i]);
  178.                     }
  179.                     free(p_pr->pr_arr);
  180.                     c_pipe->prs = p_pr->next;
  181.                     p_pr->next = NULL;
  182.                     free(p_pr);
  183.                     p_pr = c_pipe->prs;
  184.                 }*/
  185.  
  186.             }else if (!back_mode){
  187.         /*  STANDART MODE   */
  188.                 int cnt = 0;
  189.                 p_pr = c_pipe->prs;
  190.                 while (p_pr){
  191.                     cnt++;
  192.                     if (p_pr->next == NULL) break;
  193.                     else (p_pr = p_pr->next);
  194.                 }
  195.                 p_pr = c_pipe->prs;
  196.                 int fd[cnt-1][2];
  197.                 for (i = 0; i < cnt - 1; i++){
  198.                     pipe(fd[i]);
  199.                 }
  200.                 for (i = 0; p_pr && i < cnt; i++){
  201.                     //printf_prs(p_pr->pr_arr);
  202.                     if (p_pr->pr_arr[0] != NULL){
  203.                         if ((p_pr->pid = fork()) < 0){
  204.                             perror("fork ");
  205.                             exit(1);
  206.                         }else if (p_pr->pid == 0){
  207.                             if (i < cnt - 1){
  208.                                 dup2(fd[i][1], 1);
  209.                             }
  210.                             if (i > 0){
  211.                                 dup2(fd[i-1][0], 0);
  212.                             }
  213.                             for (j = 0; j < cnt - 1; j++){
  214.                                 close(fd[j][0]);
  215.                                 close(fd[j][1]);
  216.                             }
  217.                             execvp(p_pr->pr_arr[0], p_pr->pr_arr);
  218.                             perror("exec ");
  219.                             _exit(1);
  220.                         }
  221.                         p_pr = p_pr->next;
  222.                         if (p_pr == NULL) break;
  223.                     }else break;
  224.                 }
  225.                 for (i = 0; i < cnt-1; i++){
  226.                     close(fd[i][0]);
  227.                     close(fd[i][1]);
  228.                 }
  229.                 for (i = 0; i < cnt ; i++){
  230.                     pid = wait(&status);
  231.                     if (WIFEXITED(status)){
  232.                         p_pr = c_pipe->prs;
  233.                         while (p_pr){
  234.                             if (p_pr->pid == pid){
  235.                                 printf("program \"%s\" has been completed with exit status: %d\n", p_pr->pr_arr[0], WEXITSTATUS(status));
  236.                                 if (i == cnt - 1){
  237.                                     printf("pipe \"%s\" has been completed with exit status: %d\n", c_pipe->line, WEXITSTATUS(status));
  238.                                 }
  239.                                 break;
  240.                             }else{
  241.                                 p_pr = p_pr->next;
  242.                             }
  243.                             if (p_pr == NULL){
  244.                                 printf("there aren't process with pid == %d\n", (int)pid);
  245.                                 break;
  246.                             }
  247.                         }
  248.                     }else{
  249.                         p_pr = c_pipe->prs;
  250.                         while (p_pr){
  251.                             if (p_pr->pid == pid){
  252.                                 printf("program \"%s\" hasn't been completed\n", p_pr->pr_arr[0]);
  253.                                 if (i == cnt - 1){
  254.                                     printf("pipe \"%s\" hasn't been completed\n", c_pipe->line);
  255.                                 }
  256.                                 break;
  257.                             }else{
  258.                                 p_pr = p_pr->next;
  259.                             }
  260.                             if (p_pr == NULL){
  261.                                 printf("there aren't process with pid == %d\n", (int)pid);
  262.                                 break;
  263.                             }
  264.                         }
  265.                     }
  266.                 }
  267.                 /*  DELETE USED MEMORY  */
  268.                 p_pipe = pipes;
  269.                 while (p_pipe && p_pipe != c_pipe){
  270.                     p_pipe = p_pipe->next;
  271.                 }
  272.                 if (p_pipe == NULL){
  273.                     printf("Something was going wrong((\n");
  274.                 }else{
  275.                     p_pipe->next = c_pipe->next;
  276.                     free(c_pipe->line);
  277.                     p_pr = c_pipe->prs;
  278.                     while (p_pr){
  279.                         for (i = 0; p_pr->pr_arr[i] != NULL; i++){
  280.                             p_pr->pr_arr[i] = NULL;
  281.                         }
  282.                         free(p_pr->pr_arr);
  283.                         c_pipe->prs = p_pr->next;
  284.                         free(p_pr);
  285.                         p_pr = c_pipe->prs;
  286.                     }
  287.                     free(c_pipe);
  288.                 }
  289. ///////////////////////////////
  290.             }else{
  291.             /*  BACKGROUND MODE */
  292.                 printf("backgroung mode\n");
  293.                
  294.             }
  295.     printf("Please input pipe\n");
  296.     }
  297.     /*  WAIT BACK PROCESSES AND FREE ALL PIPES  */
  298.     /*                      */
  299.     return 0;
  300. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement