2017-03-04 4 views
0

So bekam ich ein Programm, das und Matrix mit zufälligen Ints erzeugt, und da eine Reihe es im Innern sucht und gibt die Ergebnisse, wenn seine dort irgendwo.Fork() und for - wieder in die for?

ich will Gabeln schaffen, in paralel in der Matrix zu suchen, everyhing funktioniert, aber die für das schafft die Gabeln(), um die Ergebnisse zu wiederholen.

Ich habe einige printfs setzen zu überprüfen, was passiert und was ich konnte, war, dass der übergeordnete Prozess und die Kinder, die Zyklen wurden Wiederholung (und damit die Ergebnisse zu wiederholen).

Warum passiert das?

#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; 

} 
+1

'if (pid [i] == 0)' Das ist das Kind Code richtig? Was macht es nach dem Ausführen des Codes in diesem Block? Was ist die nächste Codezeile, die das Kind ausführt? Gleiches für den Elterncode - was wird der Elternteil nach dem 'else' Block ausführen? – kaylum

+0

Welcher Mechanismus hat erwartet, dass der Child-Prozess die "for" -Schleife nicht weiter durchlaufen kann? – Dolda2000

+0

Vielleicht habe ich mich nicht richtig ausgedrückt. @kaylum das Kind wird die for-Schleife ausführen, dass das, was ich will es tun, wird der übergeordnete Prozess warten(), bis all Prozess beenden Kindes. Das ist was ich will. aber wenn ich es teste, schleift es den für Zyklus öfter als es sollte. (Wiederholen Sie die Ergebnisse mit dem gleichen i. wird ein Ergebnis der Ausführung des Programms hinzufügen, um zu sehen, ob es klarer wird. –

Antwort

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; 

}