fork()的问题

时间:2010-06-15 05:27:38

标签: c linux fork

我正在编写一个shell,它在父进程中读取输入,子进程使用execvp解析并执行它。

主要方法的伪代码:

do{
 pid = fork();
 print pid;
 if (p<0) { error; exit; }
 if (p>0) { wait for child to finish; read input; }
 else { call function to parse input; exit; }
}while condition
return;

发生的事情是,我似乎永远不会进入子进程(pid打印总是积极的,我永远不会进入其他)。但是,如果我不调用解析函数并且只是让其退出,我会正确地输入父和子。

full code:
int main(int argc, char *argv[]){

 char input[500];
 pid_t p;
 int firstrun = 1;

 do{

  p = fork();

  printf("PID: %d", p);

  if (p < 0) {printf("Error forking"); exit(-1);}

  if (p > 0){

   wait(NULL);
   firstrun = 0;
   printf("\n> ");
   bzero(input, 500);
   fflush(stdout);
   read(0, input, 499);
   input[strlen(input)-1] = '\0';

  }

  else exit(0);

  else { if (parse(input) != 0 && firstrun != 1) { printf("Error parsing"); exit(-1); } exit(0); }

 }while(strcmp(input, "exit") != 0);

 return 0;
}

修改

- 其他退出(0)只是我在那里忘记玩的东西

- 在打印件上添加换行符表明它确实正确地分叉并进入子进程;谢谢,问题似乎在解析

5 个答案:

答案 0 :(得分:1)

罪魁祸首是else exit(0);

那将在子shell中执行,这意味着它永远不会进入解析阶段。代码在语法上也是无效的,因为之后你有另一个 else。

答案 1 :(得分:1)

`if(p&gt; = 0){

if (p == 0) {/* chile process */}

else if (p > 0) {/* parent process */}

}其他{

/* handle the error returned by fork() */

}`

我会像上面的伪代码一样。

else exit(0);是子进程在您的代码中所做的事情。

答案 2 :(得分:0)

对于所有嵌套的ifelse来说,你的核心有点混乱。还有一些悬空else语句(else exit(0);)。我首先要清理它们。我看不到你的代码有任何其他逻辑问题。这很简单。

答案 3 :(得分:0)

交换线

else exit(0);

else { if (parse(input) != 0 && firstrun != 1) { printf("Error parsing"); exit(-1); } exit(0); }

答案 4 :(得分:0)

除了其他人所说的关于其他事情完全混乱的事实之外,还有其他一些问题,当你修复它们时会遇到这些问题。

在孩子中,input数组在第一次运行时将是垃圾,因为在分叉之前你没有放任何东西。

叉子似乎完全没有意义,因为你没有在孩子身上做任何事情,但是你正在等待孩子在父母身上完成任务。为什么不从父母那里调用解析?