2013-02-10 34 views
1

我正在寫一個C程序,它將輸入從STDIN分析成單詞,生成numsorts變量指定的許多排序過程,以循環方式將單詞按管道的排序過程,並將排序的輸出發送到STDOUT。子程序不會死在C程序中

我的程序按照需要工作,如果指定的排序進程的數量是1,就會乾淨地退出,但如果排序進程的數量大於1,排序子進程不會死掉,並且我的程序停滯不前,等待它們。對我來說,最奇怪的部分是,如果我打開一個單獨的終端窗口並殺死除1以外的所有孩子,最後一個孩子立即死亡,程序完全退出。

這是我的解析器代碼(管文件描述符被存儲在2維陣列):

void RRParser(int numsorts, int **outPipe){ //Round Robin parser 
    int i; 
    char word[MAX_WORD_LEN]; 

    //Close read end of pipes 
    for(i = 0; i < numsorts; i++){ 
     closePipe(outPipe[i][0]); 
    } 

    //fdopen() all output pipes 
    FILE *outputs[numsorts]; 
    for(i=0; i < numsorts; i++){ 
     outputs[i] = fdopen(outPipe[i][1], "w"); 
     if(outputs[i] == NULL) 
      printf("Error: could not create output stream.\n"); 
    } 

    //Distribute words to them 
    i = 0; 
    while(scanf("%[^,]%*c,", word) != EOF){ 
     strtoupper(word); 
     fputs(word, outputs[i % numsorts]); //round robin 
     fputs("\n", outputs[i % numsorts]); //sort needs newline 
     i++; 
    } 

    //Flush the streams: 
    for(i=0; i < numsorts; i++){ 
     if(fclose(outputs[i]) == EOF) 
      printf("Error closing stream.\n"); 
    } 
} 

下面是生成的排序過程(PukeAndExit(代碼)僅僅打印出錯誤消息並退出):

int *spawnSorts(int numsorts, int **inPipe){ 
    //returns an array containing all the PIDs of the child processes 
    //Spawn all the sort processes 
    pid_t pid; 
    int i; 
    int *processArray = (int *)malloc(sizeof(int) * numsorts); 
    for(i = 0; i < numsorts; i++){ 
     switch(pid = fork()){ 
      case -1: //oops case 
        PukeAndExit("Forking error\n"); 
      case 0: //child case 
       //Bind stdin to read end of pipe 
       closePipe(inPipe[i][1]); //close write end of input pipe 
       if(inPipe[i][0] != STDIN_FILENO){ //Defensive check 
        if(dup2(inPipe[i][0], STDIN_FILENO) == -1) 
         PukeAndExit("dup2 0"); 
        closePipe(inPipe[i][0]); //Close duplicate pipe 
       } 
       execlp("sort", "sort", (char *)NULL); 
       break; 
      default: //parent case 
       processArray[i] = pid; 
     } 
    } 
    return processArray; 
} 

在main()結束,下面是等待的分類處理的代碼,以死:

for(i=0; i<numsorts; i++){ //wait for child processes to die. 
    wait(NULL); 
} 

回答

0

沒關係,我想通了。該錯誤實際上是在我生成管道的函數中。只要我切換到我的spawnSorts過程中創建管道,一切正常。以前,我在一個單獨的函數中生成了一個管道數組。我不確定爲什麼現在可以工作,但它確實有效。

老generatePipes功能:

int **generatePipesArray(int numpipes){ //returns a 2-dimensional array of pipes 
     int **pipesArray = (int **) malloc(sizeof(int *) * (numpipes)); 
     int i; 
     for(i = 0; i < numpipes; i++){ 
       pipesArray[i] = (int *) malloc(sizeof(int) * 2); 
       createPipe(pipesArray[i]); 
     } 
     return(pipesArray); 
} 

新功能:

int **generatePipesArray(int numpipes){ //returns an empty 2-dimensional array 
     int **pipesArray = (int **) malloc(sizeof(int *) * (numpipes)); 
     int i; 
     for(i = 0; i < numpipes; i++){ 
       pipesArray[i] = (int *) malloc(sizeof(int) * 2); 
       //not creating pipes here anymore 
     } 
     return(pipesArray); 
} 

代碼添加到spawnSorts:

int *spawnSorts(int numsorts, int **inPipe, int **outPipe){ 
//returns an array containing all the PIDs of the child processes 
//Spawn all the sort processes 
pid_t pid; 
int i; 
int *processArray = (int *)malloc(sizeof(int) * numsorts); 
for(i = 0; i < numsorts; i++){ 
    //new code here: 
    createPipe(inPipe[i]);