Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Sa se scrie un program in C care se apeleaza asa:
- //<program> <dir>
- //Programul principal va incepe sa traverseze recursiv directorul primit ca parametru in momentul in care
- //primeste semnalul SIGUSR1. Pentru fiecare fisier intalnit care are extensia .c programul principal va
- //invoca gcc astfel incat sa se vada toate warningurile. Executabilul generat va avea acelasi nume ca si
- //fisierul primit, fara extensia .c (file.c => file)
- //Pentru fiecare fisier care are extensia .txt, programul principal va invoca un al doilea program care va
- //-procesa fisierul primit si va scrie la standard out, urmatoarele informatii:
- // numarul de linii, respectiv nr de caractere (program in C sau shell)
- //-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
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <sys/stat.h>
- #include <signal.h>
- #include <string.h>
- #include <dirent.h>
- int semnal = 0;
- int pfd1[2];
- pid_t pid;
- void handler(int signum)
- {
- semnal = 1;
- }
- void traverseaza(char *path)
- {
- if ((pid = fork()) < 0)
- {
- printf("eroare fork\n");
- exit(EXIT_FAILURE);
- }
- if (pid == 0)
- {
- char buff[1024];
- int i, r;
- close(pfd1[1]);
- while ((r = read(pfd1[0], buff, sizeof(buff))))
- {
- buff[r] = '\0';
- printf("%s", buff);
- }
- close(pfd1[0]);
- exit(0);
- }
- else
- {
- DIR *d = opendir(path);
- if (d == NULL)
- exit(EXIT_FAILURE);
- struct dirent *dir;
- char newpath[512];
- while ((dir = readdir(d)) != NULL)
- {
- if (!strcmp(dir->d_name, ".") || !strcmp(dir->d_name, ".."))
- continue;
- sprintf(newpath, "%s/%s", path, dir->d_name);
- struct stat st;
- if (stat(newpath, &st) < 0)
- exit(EXIT_FAILURE);
- if (S_ISREG(st.st_mode))
- {
- if (strstr(dir->d_name, ".c") != NULL)
- {
- char *file_name = strtok(dir->d_name, ".c");
- if (file_name != NULL)
- {
- close(pfd1[0]);
- dup2(pfd1[1], 1);
- close(pfd1[1]);
- execlp("gcc", "gcc", "-Wall", "-o", file_name, newpath, NULL);
- printf("eroare execlp\n");
- exit(EXIT_FAILURE);
- }
- }
- else if (strstr(dir->d_name, ".txt") != NULL)
- {
- close(pfd1[0]);
- dup2(pfd1[1], 1);
- close(pfd1[1]);
- execlp("wc", "wc", "-lm", newpath, NULL);
- printf("Eroare execlp\n");
- exit(EXIT_FAILURE);
- }
- }
- }
- closedir(d);
- }
- }
- int main(int argc, char *argv[])
- {
- int status;
- if (argc != 2)
- {
- printf("Usage %s <dir>\n", argv[0]);
- exit(EXIT_FAILURE);
- }
- if (pipe(pfd1) < 0)
- exit(EXIT_FAILURE);
- struct sigaction sa;
- sa.sa_handler = handler;
- sigaction(SIGUSR1, &sa, NULL);
- while (!semnal) {
- printf("waiting for signal\n");
- sleep(1);
- }
- traverseaza(argv[1]);
- if (wait(&status) < 0)
- {
- printf("error\n");
- exit(EXIT_FAILURE);
- }
- printf("status %d\n", WEXITSTATUS(status));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement