Advertisement
STANAANDREY

so2 lab4 pb1

Oct 30th, 2024
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.08 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <dirent.h>
  5. #include <string.h>
  6. #include <sys/stat.h>
  7. #include <sys/wait.h>
  8. #include <fcntl.h>
  9. #include <unistd.h>
  10. #include <ctype.h>
  11.  
  12. #define BUFF_SIZE (1 << 12)
  13.  
  14. void procRegFile(const char path[]) {
  15.     int fd = open(path, O_RDONLY);
  16.     if (fd <= 0) {
  17.         perror("");
  18.         exit(-1);
  19.     }
  20.     int cntLower = 0;
  21.     char ch;
  22.     while (read(fd, &ch, 1)) {
  23.         if (islower(ch)) {
  24.             cntLower++;
  25.         }
  26.     }
  27.     if (close(fd)) {
  28.         perror("");
  29.     }
  30.     exit(cntLower);
  31. }
  32.  
  33. void procEntry(const char path[], int *kids) {
  34.     struct stat statbuf;
  35.     if (stat(path, &statbuf)) {
  36.         perror("");
  37.         exit(-1);
  38.     }
  39.  
  40.     if (!S_ISREG(statbuf.st_mode)) {
  41.         return;
  42.     }
  43.  
  44.     pid_t kidPid = fork();
  45.     if (kidPid < 0) {
  46.         perror("");
  47.         exit(-1);
  48.     }
  49.  
  50.     if (kidPid == 0) {//kid
  51.         procRegFile(path);
  52.     }    
  53.     (*kids)++;    
  54. }
  55.  
  56. void iterDir(const char path[]) {
  57.     DIR *dir = opendir(path);
  58.     if (dir == NULL) {
  59.         perror("");
  60.         exit(-1);
  61.     }
  62.     int kids = 0, globalCnt = 0;
  63.     for (struct dirent *dep; (dep = readdir(dir));) {
  64.         const char *const dname = dep->d_name;
  65.         if (!strcmp(dname, ".") || !strcmp(dname, "..")) {
  66.             continue;
  67.         }
  68.  
  69.         char absPath[BUFF_SIZE];
  70.         sprintf(absPath, "%s/%s", path, dname);
  71.         procEntry(absPath, &kids);
  72.     }
  73.     if (closedir(dir)) {
  74.         perror("");
  75.     }
  76.  
  77.     int wstat = 0;
  78.     pid_t wr;
  79.     while ((wr = wait(&wstat)))
  80.     {
  81.         if (wr == -1) {
  82.             perror("");
  83.             exit(-1);
  84.         }
  85.         if (WIFEXITED(wstat)) {
  86.             int cnt = WEXITSTATUS(wstat);
  87.             globalCnt += cnt;
  88.         }
  89.         kids--;
  90.         if (kids == 0) {
  91.             break;
  92.         }
  93.     }
  94.     printf("%d\n", globalCnt);
  95. }
  96.  
  97. int main(int argc, char *argv[]) {
  98.     if (argc != 2) {
  99.         fprintf(stderr, "Wrong usage!\n");
  100.         exit(1);
  101.     }
  102.     iterDir(argv[1]);
  103.     return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement