2012-10-23 24 views
0

下面是一段代碼,我目前有:叉和管道工作不順利,他們執行的同時

int main() 
    { 
    int pid, fd[2], i; 
    char comanda[1000], *var, vect[100][100], text[100]; 
    if((pid = fork()) < 0) 
    { 
    perror("fork error"); 
    exit(1); 
    } 
    if(pid){ 
     printf("enter command: \n"); 
     scanf("%[^\t\n]", comanda); 
     close(fd[0]); 
     close(0); 
     var = strtok(comanda, " "); 
     i=0; 
     while(var != NULL) 
     { 
     strcpy(vect[i], var); 
     var = strtok(NULL, " "); 
     i++; 
     } 
     if(strcmp(vect[0], "login") == 0) 
     { 
      write(fd[1], "login", 5); 
      printf("I got login"); 
     } 
     close(fd[1]); 
     wait(NULL); 
    } 
    else 
    { 
     close(fd[0]); 
     int i=0; 
     read(fd[0], &text, sizeof(text)); 
     printf("This is the child "); 
     exit(0); 
    } 
    return 0; 
} 

而預期輸出爲:

  1. 輸入命令:
  2. 我輸入命令這裏 -
  3. 他在管寫道
  4. 他寫道:「我被登錄」
  5. 他又在孩子和處理我的文字

輸出我得到的是一種奇怪:

  1. 「中輸入命令:」從父......然後
  2. 「這是孩子「從孩子?!?!?!來自哪裏?!?!
  3. 詢問輸入,scanf
  4. 從父級寫入「我已登錄」。

這是一種奇怪的,我要的是讀父的東西,在管道寫,並將其發送給子進程應該真正做到與價值的東西。

+1

我相信你忘了創建一個管道。 – Art

+0

剛剛關閉文件描述符時,您認爲在子進程「讀」中會發生什麼? –

+0

我的愚蠢程度:99999.讓我們來看看它是否有效 – FinalDestiny

回答

2

你沒有初始化fd數組,因此它實際上包含有效的文件描述符。因此,孩子對read的調用會因無效的文件描述符(您應該檢查所有系統調用的返回碼)而立即失敗,這將解釋孩子的「意外」輸出。

在父(即調用fork)之前,你需要初始化fd如下:

pipe(fd); 

,並從子刪除

close(fd[0]); 

,因爲你需要從FD讀。

+0

更正,仍然像那樣運行..父母,運行printf ...然後孩子,運行printf ...然後父母再次,scanf ...我需要它首先運行父母,所有它..寫在管道中......然後是小孩。 – FinalDestiny

+0

順便說一句,現在它不顯示「我得到登錄」了,當我添加「登錄」作爲輸入 – FinalDestiny

+0

我最初在叉子後面添加了管道(fd)..現在我添加它之前,它實際上工作,這是太棒了,非常感謝你! – FinalDestiny