Título: Ordenación de vectores con creación de procesos. Publicado por: zascarac en 15 Abril 2015, 22:52 pm Hola, el caso es que tengo un problemilla con un programa que debe hacer lo siguiente:
Tenemos que diseñar un programa de ordenación de vectores de gran tamaño. El programa tendrá como argumentos el nombre del fichero que contiene el vector, el tamaño del vector y el nº de procesos en el que se quiere dividir el cálculo. Por simplicidad, el tamaño del vector debe ser múltiplo del nº de procesos. El proceso padre crea los procesos hijos y les indica la parte del fichero que deben tratar. También les indica el nombre del fichero en el que deben almacenar el resultado de la ordenación. Por ejemplo, si tenemos un fichero con un vector de 100 elementos, y queremos dividir el cálculo en 10 procesos, el proceso número 1 tendrá que tratar los elementos del 1 al 10, el proceso 2 los elementos del 11 al 20, y así sucesivamente. Finalmente, el programa principal deberá hacer la ordenación final leyendo los ficheros parcialmente ordenados por los procesos. Mi idea es guardar los números en un array. A los procesos les paso la cantidad de números que deben ordenar y el puntero al primer número del array a partir del cual deben ordenar. El problema es que no me deja pasar punteros a los procesos y no sé como pasarle el array al proceso hijo. Este es el código que tengo, que es un poco ***** seca XD. #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> int main(int argc,char *argv[]){ int tam=atoi(argv[2]),status;//tam es el tamano del vector a ordenar int proc=atoi(argv[3]);//proc es el numero de procesos a lanzar //COmprobacioones previas de argumentos correctos. if(argc!=4){ printf("Error. Numero de parametros de entrada incorrecto"); exit(-1); } else if(tam<=0 || proc<=0){ printf("el numero de procesos o el tamano del vector es incoherente %i %i",tam,proc); exit(-1); } else if(tam<proc){ printf("No puede haber mas procesos que longitud tiene el vector"); exit(-1); } else{ FILE *fich; fich=fopen(argv[1],"r"); int vector[tam],i=0,procvec,num; int *puntero[proc];//array de punteros procvec=tam/proc;//Esta variable establece cuantos numeros debe manejar cada proceso int k=1; while (fscanf(fich,"%i",&num)==1){ vector=num; if(i==(procvec)){ puntero[k]=&vector;//Al proceso se le enviara la direccion del primer numero a partir del cual //debe ordenar. Ademas de la cantidad de numeros a ordenar(procvec). procvec=procvec*2; } i++; } puntero[0]=&vector[0]; int j=0; for(i=0;i<proc;i++){ pid_t creado; creado=fork(); if (creado==-1) break; else if(creado==0){ char texto1[1000000],texto2[1000000],texto3[100000]; sprintf(texto1,"%i",procvec); sprintf(texto2,"%p",puntero);//Esta ***** es la que falla.Buscar otra forma. execl("/home/alumno/filckl/practica2/herramienta","herramienta",texto1,texto2,NULL); //herramienta es el programa con el que se muta el proceso hijo y que //ordena un vector. Este funciona bien, no hay problema. } else{ printf("Soy el padre"); wait(&status); } } } } |