Advertisement
Alx09

SO

Feb 23rd, 2024
822
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.63 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <dirent.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <string.h>
  8. #include <fcntl.h>
  9. #include <signal.h>
  10.  
  11. #define MAX_FILENAME_LENGTH 256
  12.  
  13. int pipefd[2];
  14.  
  15. void handle_signal(int signal) {
  16.     if (signal == SIGALRM) {
  17.         printf("Timpul a expirat!\n");
  18.         close(pipefd[1]);
  19.         exit(EXIT_SUCCESS);
  20.     }
  21.     else if (signal == SIGUSR1) {
  22.         printf("Procesul P a primit semnal pentru stergerea fisierului.\n");
  23.     }
  24. }
  25.  
  26. void process_file(char *filename) {
  27.     int fd;
  28.     struct stat file_stat;
  29.     char buffer[MAX_FILENAME_LENGTH];
  30.     fd = open(filename, O_RDONLY);
  31.     if (fd == -1) {
  32.         perror("Eroare la deschiderea fisierului");
  33.         return;
  34.     }
  35.     fstat(fd, &file_stat);
  36.     read(fd, buffer, MAX_FILENAME_LENGTH);
  37.     printf("Nume fisier: %s, Dimensiune: %ld bytes\n", buffer, file_stat.st_size);
  38.     close(fd);
  39.     unlink(filename);
  40. }
  41.  
  42. void process_directory(char *dirname, int interval) {
  43.     DIR *dir;
  44.     struct dirent *entry;
  45.     struct stat file_stat;
  46.     int pid;
  47.     if ((pid = fork()) == -1) {
  48.         perror("Eroare la fork");
  49.         exit(EXIT_FAILURE);
  50.     }
  51.     else if (pid == 0) {
  52.         close(pipefd[1]);
  53.         dup2(pipefd[0], STDIN_FILENO);
  54.         close(pipefd[0]);
  55.         execl("./proces_F", "proces_F", NULL);
  56.         perror("Eroare la executia procesului F");
  57.         exit(EXIT_FAILURE);
  58.     }
  59.     close(pipefd[0]);
  60.     write(pipefd[1], dirname, strlen(dirname) + 1);
  61.     signal(SIGALRM, handle_signal);
  62.     signal(SIGUSR1, handle_signal);
  63.     alarm(interval);
  64.     dir = opendir(dirname);
  65.     if (dir == NULL) {
  66.         perror("Eroare la deschiderea directorului");
  67.         exit(EXIT_FAILURE);
  68.     }
  69.     while ((entry = readdir(dir)) != NULL) {
  70.         if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
  71.             continue;
  72.         char filepath[MAX_FILENAME_LENGTH];
  73.         snprintf(filepath, MAX_FILENAME_LENGTH, "%s/%s", dirname, entry->d_name);
  74.         if (stat(filepath, &file_stat) == -1) {
  75.             perror("Eroare la obtinerea informatiilor despre fisier");
  76.             continue;
  77.         }
  78.         if (S_ISREG(file_stat.st_mode)) {
  79.             write(pipefd[1], entry->d_name, strlen(entry->d_name) + 1);
  80.         }
  81.     }
  82.     closedir(dir);
  83.     wait(NULL);
  84. }
  85.  
  86. int main(int argc, char *argv[]) {
  87.     if (argc != 3) {
  88.         exit(EXIT_FAILURE);
  89.     }
  90.     if (pipe(pipefd) == -1) {
  91.         perror("Eroare la crearea pipe-ului");
  92.         exit(EXIT_FAILURE);
  93.     }
  94.     process_directory(argv[1], atoi(argv[2]));
  95.     return 0;
  96. }
  97.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement