因此,我得到了一个使用随机整数创建和矩阵的程序,并给出了一个在其内部搜索并给出结果的数字(如果它在某处)。

我想创建forks来在矩阵内的paralel中搜索,一切正常,但是为此创建的forks()重复了结果。

我已经使用一些printfs来检查正在发生的事情,我可以看到的是父进程和子进程正在重复循环(并因此重复了结果)。

为什么会这样呢?

#include <stdio.h>
#include <unistd.h> /* chamadas ao sistema: defs e decls essenciais */
#include <sys/wait.h> /* chamadas wait*() e macros relacionadas */
#include <stdlib.h> /* random */
#include <time.h> // para rand();

int main(int argc, char *argv[]) {

    int num,i,j,z;
    int linhas=4, colunas=10;
    int pid[linhas];
    int matriz[linhas][colunas];

    srand((unsigned)time(NULL)); //random seed

    if (argc < 2) { printf("FNumber to search is missing use:\n ./%s number\n",argv[0]); exit(1);}
    num = atoi(argv[1]);

    //create random matrix
    for (i = 0; i<linhas; i++) {
        printf("\n");
        for (j = 0; j<colunas; j++) {
            matriz[i][j] = rand()%50+1; //matrix with randoms from 1-50
            printf("%i\t",matriz[i][j] );
        }
    }

    printf("\n\nSearch Results:\n");

    //create paralell process to search matrix
    printf("\n");
    for (i=0;i<linhas;i++) {
        pid[i] = fork();
        if (pid[i] == 0) {
            for(z=0;z<colunas;z++) {
                if (matriz[i][z] == num) { printf("Found %i at matriz[%i][%i]\n",num,i,z); }
            }
        }
        else { wait(NULL); }

    }


    return 0;

}

最佳答案

#include <stdio.h>
#include <unistd.h> /* chamadas ao sistema: defs e decls essenciais */
#include <sys/wait.h> /* chamadas wait*() e macros relacionadas */
#include <stdlib.h> /* random */
#include <time.h> // para rand();

/*Pretende-se determinar a existencia de um determinado n ́umero inteiro nas linhas de numa matriz de
numeros inteiros, em que o n ́umero de colunas e muito maior do que o numero de linhas. Implemente,
utilizando processos um programa que determine a existencia de um determinado numero, recebido como
argumento, numa matriz gerada aleatoriamente. */

int main(int argc, char *argv[]) {

    int num,i,j,z;
    int linhas=4, colunas=10;
    int pid[linhas];
    int matriz[linhas][colunas];

    srand((unsigned)time(NULL)); //random seed

    if (argc < 2) { printf("FNumber to search is missing use:\n ./%s number\n",argv[0]); exit(1);}
    num = atoi(argv[1]);

    //create random matrix
    for (i = 0; i<linhas; i++) {
        printf("\n");
        for (j = 0; j<colunas; j++) {
            matriz[i][j] = rand()%10+1; //matrix with randoms from 1-50
            printf("%i\t",matriz[i][j] );
        }
    }

    printf("\n\nSearch Results:\n");

    //create paralell process to search matrix
    printf("\n");
    for (i=0;i<linhas;i++) {
        pid[i] = fork();
        if (pid[i] == 0) {
            for(z=0;z<colunas;z++) {
                if (matriz[i][z] == num) { printf("Found %i at matriz[%i][%i]\n",num,i,z); }
            }
        _exit(0);
        }
    }

    for(i=0;i<linhas;i++) {
        wait(NULL);
    }

    return 1;

}

07-26 03:07