Advertisement
STANAANDREY

so2 procs dir size

Nov 13th, 2024 (edited)
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.39 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <unistd.h>
  7. #include <dirent.h>
  8. #include <string.h>
  9. #include <signal.h>
  10. #include <stdbool.h>
  11. #include <sys/wait.h>
  12.  
  13. #define BUF_SIZE (1 << 10)
  14.  
  15. bool done = false;
  16.  
  17. void SIGUSR2Handler(int sig) {
  18.     done = true;
  19. }
  20.  
  21. void iterDir(const char path[], int pipefd) {
  22.     DIR *dir = opendir(path);
  23.     if (dir == NULL) {
  24.         perror("opendir");
  25.         exit(1);
  26.     }
  27.     for (struct dirent *de; (de = readdir(dir));) {
  28.         if (!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) {
  29.             continue;
  30.         }
  31.         char absPath[BUF_SIZE];
  32.         sprintf(absPath, "%s/%s", path, de->d_name);
  33.         struct stat statBuff;
  34.         if (stat(absPath, &statBuff)) {
  35.             perror("stat");
  36.             exit(1);
  37.         }
  38.         if (S_ISREG(statBuff.st_mode)) {
  39.             int filePipe[2];
  40.             if (pipe(filePipe)) {
  41.                 perror("pipe");
  42.                 exit(1);
  43.             }
  44.             pid_t pid = fork();
  45.             if (pid == -1) {
  46.                 perror("fork");
  47.                 exit(1);
  48.             }
  49.             if (pid == 0) {
  50.                 close(filePipe[0]);
  51.                 if (dup2(filePipe[1], STDOUT_FILENO) == -1) {
  52.                     perror("dup2");
  53.                     exit(1);
  54.                 }
  55.                 execlp("wc", "wc", "-c", absPath, (char *)NULL);
  56.                 perror("execlp");
  57.                 exit(1);
  58.             }
  59.             close(filePipe[1]);
  60.             FILE *f = fdopen(filePipe[0], "r");
  61.             if (f == NULL) {
  62.                 perror("fdopen");
  63.                 exit(1);
  64.             }
  65.             int fileSize;
  66.             fscanf(f, "%d", &fileSize);
  67.             write(pipefd, &fileSize, sizeof(fileSize));
  68.             fclose(f);
  69.         } else if (S_ISDIR(statBuff.st_mode)) {
  70.             iterDir(absPath, pipefd);
  71.         }
  72.     }
  73.     if (closedir(dir)) {
  74.         perror("closedir");
  75.     }
  76. }
  77.  
  78. int main(int argc, char *argv[]) {
  79.     if (argc != 2) {
  80.         fprintf(stderr, "Usage: %s <directory>\n", argv[0]);
  81.         exit(1);
  82.     }
  83.  
  84.     struct sigaction sa;
  85.     memset(&sa, 0, sizeof(struct sigaction));
  86.     sa.sa_handler = SIGUSR2Handler;
  87.     if (sigaction(SIGUSR2, &sa, NULL) == -1) {
  88.         perror("sigaction");
  89.         exit(1);
  90.     }
  91.  
  92.     int pipefd[2];
  93.     if (pipe(pipefd) == -1) {
  94.         perror("pipe");
  95.         exit(1);
  96.     }
  97.  
  98.     pid_t concentratorPid = fork();
  99.     if (concentratorPid == -1) {
  100.         perror("fork");
  101.         exit(1);
  102.     }
  103.  
  104.     if (concentratorPid == 0) {
  105.         close(pipefd[1]);
  106.         int totalSize = 0;
  107.         int fileSize;
  108.         while (read(pipefd[0], &fileSize, sizeof(fileSize)) > 0) {
  109.             totalSize += fileSize;
  110.         }
  111.         close(pipefd[0]);
  112.         printf("Total size: %d\n", totalSize);
  113.         exit(0);
  114.     }
  115.  
  116.     close(pipefd[0]);
  117.  
  118.     while (!done) {
  119.         printf("WAIT\n");
  120.         sleep(1);
  121.     }
  122.  
  123.     iterDir(argv[1], pipefd[1]);
  124.     close(pipefd[1]);
  125.  
  126.     // Wait for all child processes to finish
  127.     int ws;
  128.     pid_t cp;
  129.     while ((cp = wait(&ws)) > 0) {
  130.         if (WIFEXITED(ws)) {
  131.             printf("Child %d finished with code %d!\n", cp, WEXITSTATUS(ws));
  132.         } else {
  133.             puts("Child has been brutally murdered!");
  134.         }
  135.     }
  136.     return 0;
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement