Advertisement
razvanth21

Untitled

Dec 13th, 2018
327
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.70 KB | None | 0 0
  1. //Sa se scrie un program in C care se apeleaza asa:
  2. //<program> <dir>
  3. //Programul principal va incepe sa traverseze recursiv directorul primit ca parametru in momentul in care
  4. //primeste semnalul SIGUSR1. Pentru fiecare fisier intalnit care are extensia .c programul principal va
  5. //invoca gcc astfel incat sa se vada toate warningurile. Executabilul generat va avea acelasi nume ca si
  6. //fisierul primit, fara extensia .c (file.c => file)
  7.  
  8. //Pentru fiecare fisier care are extensia .txt, programul principal va invoca un al doilea program care va  
  9. //-procesa fisierul primit si va scrie la standard out, urmatoarele informatii:
  10.   //  numarul de linii, respectiv nr de caractere (program in C sau shell)
  11. //-procesa outputul de la gcc, respectiv de la al doilea program, folosindu-se de un pipe,iar la final va scrie numarul total de linii si nr total de caractere
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <unistd.h>
  16. #include <fcntl.h>
  17. #include <sys/types.h>
  18. #include <sys/wait.h>
  19. #include <sys/stat.h>
  20. #include <signal.h>
  21. #include <string.h>
  22. #include <dirent.h>
  23.  
  24. int semnal = 0;
  25. int pfd1[2];
  26. pid_t pid;
  27.  
  28. void handler(int signum)
  29. {
  30.     semnal = 1;
  31. }
  32.  
  33. void traverseaza(char *path)
  34. {
  35.     if ((pid = fork()) < 0)
  36.     {
  37.         printf("eroare fork\n");
  38.         exit(EXIT_FAILURE);
  39.     }
  40.  
  41.     if (pid == 0)
  42.     {
  43.         char buff[1024];
  44.         int i, r;
  45.  
  46.         close(pfd1[1]);
  47.  
  48.         while ((r = read(pfd1[0], buff, sizeof(buff))))
  49.         {
  50.             buff[r] = '\0';
  51.             printf("%s", buff);
  52.         }
  53.  
  54.         close(pfd1[0]);
  55.         exit(0);
  56.     }
  57.     else
  58.     {
  59.         DIR *d = opendir(path);
  60.  
  61.         if (d == NULL)
  62.             exit(EXIT_FAILURE);
  63.  
  64.         struct dirent *dir;
  65.         char newpath[512];
  66.  
  67.         while ((dir = readdir(d)) != NULL)
  68.         {
  69.             if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, ".."))
  70.                 continue;
  71.  
  72.             sprintf(newpath, "%s/%s", path, dir->d_name);
  73.  
  74.             struct stat st;
  75.  
  76.             if (stat(newpath, &st) < 0)
  77.                 exit(EXIT_FAILURE);
  78.  
  79.             if (S_ISREG(st.st_mode))
  80.             {
  81.                 if (strstr(dir->d_name, ".c") != NULL)
  82.                 {
  83.                     char *file_name = strtok(dir->d_name, ".c");
  84.  
  85.                     if (file_name != NULL)
  86.                     {
  87.                         close(pfd1[0]);
  88.                         dup2(pfd1[1], 1);
  89.                         close(pfd1[1]);
  90.  
  91.                         execlp("gcc", "gcc", "-Wall", "-o", file_name, newpath, NULL);
  92.                         printf("eroare execlp\n");
  93.  
  94.                         exit(EXIT_FAILURE);
  95.                     }
  96.                 }
  97.                 else if (strstr(dir->d_name, ".txt") != NULL)
  98.                 {
  99.                     close(pfd1[0]);
  100.                     dup2(pfd1[1], 1);
  101.                     close(pfd1[1]);
  102.  
  103.                     execlp("wc", "wc", "-lm", newpath, NULL);
  104.                     printf("Eroare execlp\n");
  105.  
  106.                     exit(EXIT_FAILURE);
  107.                 }
  108.             }
  109.         }
  110.  
  111.         closedir(d);
  112.     }
  113. }
  114.  
  115. int main(int argc, char *argv[])
  116. {
  117.     int status;
  118.    
  119.     if (argc != 2)
  120.     {
  121.         printf("Usage %s <dir>\n", argv[0]);
  122.         exit(EXIT_FAILURE);
  123.     }
  124.  
  125.     if (pipe(pfd1) < 0)
  126.         exit(EXIT_FAILURE);
  127.  
  128.     struct sigaction sa;
  129.  
  130.     sa.sa_handler = handler;
  131.     sigaction(SIGUSR1, &sa, NULL);
  132.  
  133.     while (!semnal) {
  134.         printf("waiting for signal\n");
  135.         sleep(1);
  136.     }
  137.  
  138.     traverseaza(argv[1]);
  139.  
  140.     if (wait(&status) < 0)
  141.     {
  142.         printf("error\n");
  143.         exit(EXIT_FAILURE);
  144.     }
  145.  
  146.     printf("status %d\n", WEXITSTATUS(status));
  147.  
  148.     return 0;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement