como crear multiples procesos en C y tuberias pipe()

Iniciado por yeah_2796, 19 Diciembre 2018, 16:05 PM

0 Miembros y 1 Visitante están viendo este tema.

yeah_2796

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

#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';
printf("%s :", dirent_ptr -> d_name);
printf("%s\n", buffer);


wait(&s);