2012-10-23 60 views
0

因此,代碼是這樣的一個:問題與管道和叉,那就只子進程一次,而每次我想

int main() 
{ 
    int pid, fd[2], i, j; 
    char comanda[1000], comm[100][100], *var, *var2, vect[100][100], text[1000], check[10000]; 
    if(pipe(fd)<0) 
    { 
    perror("pipe error"); 
    exit(1); 
    } 
    if((pid = fork()) < 0) 
    { 
    perror("fork error"); 
    exit(1); 
    } 
    j = 0; 
    if(pid){ 
     do { 
     if(j > 0) fgets (check , 1000 , stdin); //just in case there's still something in the buffer 
     printf("enter command: \n"); 
     scanf("%[^\t\n]", comanda); 
     if(var = strtok(comanda, " ")) 
     { 
      i=0; 
      while(var != NULL) 
      { 
      strcpy(vect[i], var); 
      var = strtok(NULL, " "); 
      i++; 
      } 
     } 
     else 
      strcpy(vect[0], comanda); 
     if(strcmp(vect[0], "login") == 0) 
     { 
      write(fd[1], "login ", 6); 
      write(fd[1], vect[1], strlen(vect[1])); 
      printf("I got login"); 
     } 
     else if(strcmp(vect[0], "quit") == 0) 
     { 
      exit(1); 
     } 
     else 
      printf("I got the command %s \n", vect[0]); 
     j++; 
     } while(1); 
     close(fd[0]); 
     close(fd[1]); 
     wait(NULL); 
    } 
    else 
    { 
     close(fd[1]); 
     printf("copil? \n"); 
     int i=0; 
     read(fd[0], text, sizeof(text)); 
     var2 = strtok(text, " "); 
     j=0; 
     while(var2 != NULL) 
     { 
     strcpy(comm[j], var2); 
     var2 = strtok(NULL, " "); 
     j++; 
     } 
     if(strcmp(comm[0], "login") == 0) 
     { 
      //comanda e login, deci verificam username-ul. 
      if(login(comm[1])) 
      { 
      printf("OK, Logged IN! \n"); 
      } 
      else 
      { 
      printf("Username not in /etc/passwd \n"); 
      } 
     } 
     close(fd[0]); 
     exit(0); 
    } 
    return 0; 
} 

我想是從控制檯線,每次我讀命令得到一個已知的命令,去找孩子並執行它。現在它讀取命令罰款,登錄工作正常,但只有一次。之後,它仍然獲得登錄信息,它會打印出「我已登錄」,但它不會發送給孩子,並且如果沒有問題,請檢查它。

回答

2

你有三個大問題,我可以看到:

  1. 第一個是你不終止你的孩子管讀取字符串;
  2. 另一方面,也是問題的根源在於孩子不會循環,但會執行一次然後退出;
  3. 第三種情況是,如果您將子項更改爲循環,並且您退出父進程,那麼子進程將被放棄,並且只是繼續等待從未到來的輸入。
+0

謝謝...但是,我如何應以什麼我需要努力糾正代碼的任何想法? – FinalDestiny

+0

@FinalDestiny在我的答案中指出兩個,你應該循環在孩子中,就像你在父母中一樣。 –

+0

好的,非常感謝你,會試試:) – FinalDestiny

1

這是因爲您的子進程剛剛退出。它似乎首先「讀(fd [0],文本,sizeof(文本));」阻塞,直到它將從父進程接收一些數據。然後它執行數據並退出。

順便說一句,調用waitpid函數以避免殭屍進程可能是您的應用程序的一些問題是個好主意。還有什麼更應該「關閉(fd [0]);」在父進程開始時不在和「close(fd [1]);」;

1

我有同樣的問題。我的想法是通過一個管道控制另一個進程,就像從鍵盤/ stdin獲得輸入一樣。這是應用程序間進程間通信的經典需求,它不是爲它設計的。

問題是,所有的示例代碼只是在開始時將一些東西發送給子進程標準輸入。在我看來,管道必須在父母一方關閉,以便孩子方收到數據。一旦關閉,我不能「重新打開」它發送另一個命令。

什麼救了我的一天是這樣的: http://rachid.koucha.free.fr/tech_corner/pty_pdip.html

http://en.wikipedia.org/wiki/Pseudo_terminal

我不知道爲什麼我花了近兩天來弄明白,因爲它聽起來真的很明顯的事情後所有。我在這裏發佈這篇文章,因爲我在這一邊登陸,答案並沒有真正解決我的問題。

誠懇, 羅伯特

相關問題