int main(int argc, char *argv[]) { int n_tasks, rank, rc, tag=1; unsigned int i = 0; unsigned int n_linhas, size_job; unsigned int job[2]; MPI_Status Stat; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD, &n_tasks); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if(rank == 0) { n_linhas = numero_de_linhas(); size_job = n_linhas/(n_tasks-1); if((n_linhas % (n_tasks-1)) != 0) size_job++; //printf("size_job: %d\n\n",size_job); for(i=1;i<n_tasks;i++) { job[0] = (i-1)*size_job + 1; job[1] = i*size_job; if(job[0] > n_linhas) job[0] = n_linhas; if(job[1] > n_linhas) job[1] = n_linhas; rc = MPI_Send(&job, 2, MPI_INT, i, tag, MPI_COMM_WORLD); } } else { rc = MPI_Recv(&job, 2, MPI_INT, 0, tag, MPI_COMM_WORLD, &Stat); //printf("rank%d: %d a %d\n",rank,job[0],job[1]); grep(rank,job[0],job[1]); } MPI_Finalize(); return 0; }
void menu() {//responsavel pela leitura de cada linha e envio para os processos filhos signal(SIGINT, sigint); int k; char linha[50]; int check=0; char choice; int numero=numero_de_linhas();// funcao responsavel por contar o numero de linhas do ficheiro printf("1-ataque\n2-sair\n"); choice=getchar(); FILE *f; while(check==0){ if(choice=='1'||choice=='2') { if(choice=='1') { f=fopen(STUDENTS_FILE,"r"); close(fd[0][0]); close(fd[1][0]); for(k=0;k<(numero);k++){ while(fgets(linha,50,f)!=0){ if(k%2==0) { // um processo recebe linhas de indice par e outro as linhas de indice impar write(fd[0][1],linha,(strlen(linha)*(sizeof(char)))); //diz que não é vector nem ponteiro e poucos argument0s } } else { write(fd[1][1],linha,(strlen(linha)*(sizeof(char)))); } } } fclose(f); } else if (choice=='2') { printf("A sair do programa\n"); menu(pid); kill( pid[0],SIGKILL);// mata os restantes processos kill( pid[1],SIGKILL); kill( pid[2],SIGKILL); kill(pid[3],SIGKILL); wait(NULL); wait(NULL); wait(NULL); wait(NULL); exit(0); } } } }