Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: yeah_2796 en 19 Diciembre 2018, 16:05 pm



Título: como crear multiples procesos en C y tuberias pipe()
Publicado por: yeah_2796 en 19 Diciembre 2018, 16:05 pm
hola verán tengo mi codigo que cuenta la cantidad de archivos que hay en un directorio y después devuelve el nombre de ese archivo junto a su md5sum , lo que sucede es que mi tarea dice lo siguiente:

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
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include <unistd.h>
  7. #include <sys/wait.h>
  8. #include<dirent.h>
  9.  
  10. char buffer[100];
  11.  
  12. int s;
  13.  
  14.  
  15.  
  16. int path_is_dir(char *path) {   //valido si son subdirectorios
  17.    struct stat st_info;
  18.  
  19.    if (stat(path, &st_info) < 0) {
  20.        return 0;
  21.    }
  22.  
  23.    return S_ISDIR(st_info.st_mode);
  24. }
  25.  
  26.  
  27. void validar_folder(){
  28.  
  29. int carp;
  30.  
  31. DIR *dirp_p;
  32. struct dirent *entry;
  33. dirp_p = opendir("/home/jose/Escritorio/carpetaPrueba") ; //va "/var/log/PROYECTO_SO_1"
  34.  
  35.    if(dirp_p == NULL ){
  36.        carp= mkdir("carpetaPrueba",0777);          //creo la carpeta
  37.    }
  38.  
  39. }
  40.  
  41.  
  42. int main(){
  43.  
  44. int cont_file=0;
  45. int inf[2];
  46.  
  47. validar_folder();
  48.  
  49. pipe(inf);
  50.  
  51. DIR *dirp;
  52. struct dirent * entry;
  53. dirp = opendir("/home/jose/Escritorio");
  54.  
  55. while ((entry = readdir(dirp) )!=NULL) { //cuanto la cant de archivos
  56.     if (entry->d_type == DT_REG) {
  57.       cont_file++;
  58.    }
  59. }
  60. closedir(dirp);
  61.  
  62.  
  63. const char * dir_name = "/home/jose/Escritorio";            
  64. DIR * dir_ptr = NULL;
  65. struct dirent * dirent_ptr;        
  66.  
  67. dir_ptr = opendir( dir_name );
  68.  
  69. //int f = open("prueba.txt", O_CREAT | O_WRONLY, S_IRWXU | S_IRWXG | S_IRWXO);
  70.  
  71. while ( (dirent_ptr = readdir( dir_ptr ) ) != NULL ){
  72.  
  73. if(!path_is_dir(dirent_ptr -> d_name)){
  74.  
  75. if(fork()==0){
  76.  
  77. close(1);
  78.  
  79. dup(inf[1]); // redirige la salida estandar
  80.  
  81. execl("/usr/bin/md5sum", "md5sum", dirent_ptr -> d_name, NULL);
  82.  
  83. }else{
  84.  
  85. read(inf[0], buffer, 100);
  86.  
  87. buffer[32] = '\0';
  88. printf("%s :", dirent_ptr -> d_name);
  89. printf("%s\n", buffer);
  90.  
  91.  
  92. wait(&s);