2017-03-04 45 views
0

所以,我得到了一個程序,它創建了一個隨機整數,並給出了一個數字,它在裏面搜索並給出結果,如果它存在的話。叉()和 - 重新進入?

我想創建分叉以在矩陣內進行搜索,但是爲了創建叉()正在重複結果。

我已經把一些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; 

} 
+1

'如果(PID [I] == 0)'這是孩子的代碼嗎?在塊內執行代碼後它做了什麼?孩子將執行的下一行代碼是什麼?父代碼相同 - 父代在「else」代碼塊後執行什麼? – kaylum

+0

你期望什麼機制會阻止子進程進一步迭代'for'循環? – Dolda2000

+0

也許我沒有正確表達自己。 @kaylum孩子將執行for循環,那我想要它做什麼,父進程將等待()直到所有子進程完成。那就是我想要的。 但是當我測試它時,它循環更多的次數比它應該。 (重複結果與我 將增加運行程序的結果,看看它是否變得更清晰 –

回答

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; 

}