2012-10-23 17 views
1

我有这样的代码:管和叉的问题 - 在管一些输入不正确清除

int main() 
{ 
    int pid, fd[2], i, j; 
    char comanda[1000], comm[100][100], *var, *var2, vect[100][100], check[10000]; 
    if(pipe(fd)<0) // nu creaza pipe-ul 
    { 
    perror("pipe error"); 
    exit(1); 
    } 
    if((pid = fork()) < 0) //nu face fork 
    { 
    perror("fork error"); 
    exit(1); 
    } 
    j = 0; 
    if(pid){ 
     do { 
     if(j > 0) fgets (check , 1000 , stdin); 
     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("Sending the child %s \n", vect[1]); 
     } 
     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 
    { 
     do 
     { 
      char text[1000]; 
      close(fd[1]); 
      int i=0; 
      strcpy(text, ""); 
      read(fd[0], text, sizeof(text)); 
      printf("I've read %s \n", text); 
      var2 = strtok(text, " "); 
      j=0; 
      while(var2 != NULL) 
      { 
      strcpy(comm[j], var2); 
      var2 = strtok(NULL, " "); 
      j++; 
      } 
      if(strcmp(comm[0], "login") == 0) 
      { 
       printf("comm[1] e %d \n", comm[1]); 
       if(login(comm[1])) 
       { 
       printf("OKK! \n"); 
       } 
       else 
       { 
       printf("Username not in /etc/passwd \n"); 
       } 
      } 

      //close(fd[0]); 
     } while(1); 
    } 
    return 0; 
} 

现在的问题是....在父进程同时读取命令......如果我给他登录adam.johnson ...它发送adam.johnson罚款给约翰逊他在那里工作...现在,当它回到父进程,如果我再给他他登录wa,它会从父母处读取登录waam.johnson(保留来自adam.johnson的am.johnson,这是坏的!)

回答

0

在孩子中,您没有使用read(读取的字节数)调用的返回值,并且父母中也没有发送结束字符串的nul字符。因此,在发送比最后一个字符串短的字符串时,您正在重新使用上次读取的缓冲区的一部分。

您可以尝试在父发送NUL字符:

write(fd[1], "login ", 6); 
write(fd[1], vect[1], strlen(vect[1]) +1); 
+0

太谢谢你了! – FinalDestiny

+0

非常欢迎。我建议还要检查read()和write()返回值以解决可能的错误。 –