2012-10-23 18 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