La aplicacion debe examinar una vez cada cierto tiempo el contenido del directorio “/var/log”, para identificar los cambios que hayan ocurrido en los archivos de log del sistema desde la u´ltima revisi´on. Se deben omitir los subdirectorios y los archivos con extension “.gz”. Para verificar los archivos debe utilizar el comando de shell “md5sum” mediante las llamadas al sistema fork y exec. Por cada archivo a ser procesado su aplicaci´on debe crear un subproceso el cual se encargar de ejecutar el comando “md5sum”. El resultado del comando debe ser retornado
entonces encontre un codigo aqui en stackoverflow sobre como crear multiples procesos hijos: https://stackoverflow.com/questions/876605/multiple-child-process , lo cual supongo que es como lo piden en mi enunciado ya que dice "por cada archivo a prcesar se crea un subproceso" pero queria saber si es la manera correcta.
lo segundo es con las tuberias, yo tengo mi funcion piepe() y mi arreglo inf[2] y usando la funcion dup. redirigo la salida y entrada, pero tengo duda si tengo que crear una especie de arreglo dianmico o un arreglo de arreglo , ya que se deben crear N tuberias de acuerdo a mis N archivos leidos
Código
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include<stdio.h> #include<stdlib.h> #include <unistd.h> #include <sys/wait.h> #include<dirent.h> char buffer[100]; int s; int path_is_dir(char *path) { //valido si son subdirectorios struct stat st_info; if (stat(path, &st_info) < 0) { return 0; } return S_ISDIR(st_info.st_mode); } void validar_folder(){ int carp; DIR *dirp_p; struct dirent *entry; dirp_p = opendir("/home/jose/Escritorio/carpetaPrueba") ; //va "/var/log/PROYECTO_SO_1" if(dirp_p == NULL ){ carp= mkdir("carpetaPrueba",0777); //creo la carpeta } } int main(){ int cont_file=0; int inf[2]; validar_folder(); pipe(inf); DIR *dirp; struct dirent * entry; dirp = opendir("/home/jose/Escritorio"); while ((entry = readdir(dirp) )!=NULL) { //cuanto la cant de archivos if (entry->d_type == DT_REG) { cont_file++; } } closedir(dirp); const char * dir_name = "/home/jose/Escritorio"; DIR * dir_ptr = NULL; struct dirent * dirent_ptr; dir_ptr = opendir( dir_name ); //int f = open("prueba.txt", O_CREAT | O_WRONLY, S_IRWXU | S_IRWXG | S_IRWXO); while ( (dirent_ptr = readdir( dir_ptr ) ) != NULL ){ if(!path_is_dir(dirent_ptr -> d_name)){ if(fork()==0){ close(1); dup(inf[1]); // redirige la salida estandar execl("/usr/bin/md5sum", "md5sum", dirent_ptr -> d_name, NULL); }else{ read(inf[0], buffer, 100); buffer[32] = '\0'; wait(&s);