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;
}
示例#2
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);
            }
}
}
}