叉的问题
我正在写一个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)只是我从玩弄
-adding一个换行符到打印忘了还有表明,它实际上正确分叉并进入子进程;谢谢你,这个问题似乎是在解析
的罪魁祸首之一是else exit(0);
这会在孩子的外壳,这意味着它不会继续执行分析阶段执行。该代码在语法上也是无效的,因为在此之后,您还有另外。
'这很有意思 - 显示的代码不会编译;在这个时刻之前的其他人没有一个,如果它属于,是吗? – 2010-06-15 05:38:07
在我看来,这是一个尝试调试的东西。该代码甚至不会在编译时留下,所以它可能被添加到以显示迄今为止已完成的工作,但其他内容未被注释掉。 – cHao 2010-06-15 05:51:35
你的核心与所有嵌套的if
和else
都是混乱的。还有一些悬挂的else
陈述(else exit(0);
)。我会开始清理这些。我看不到任何其他的代码逻辑问题。这很简单。
交换线路
else exit(0);
和
else { if (parse(input) != 0 && firstrun != 1) { printf("Error parsing"); exit(-1); } exit(0); }
这仍然是语法无效的。 – 2010-06-15 05:39:30
`如果(P> = 0){
if (p == 0) {/* chile process */}
else if (p > 0) {/* parent process */}
}否则{
/* handle the error returned by fork() */
}`
我会这样做,就像上面的伪代码。
else exit(0);
是子进程在您的代码中执行的操作。
除了其他人已经说过的其他事情都是一团糟的事情之外,还有一些其他问题会在你修复它们时遇到。
在孩子中,input
数组将在第一次运行时被垃圾回收,因为在分岔之前没有放入任何东西。
看起来叉子根本没有意义,因为你没有在孩子身上做任何事情,但你正在等待孩子在父母身上完成。为什么不从父级调用解析?
如果您在打印PID的语句中添加了换行符,您可能会看到子pid为零。 – 2010-06-15 05:40:31
只是想知道......你为什么在分手之前知道你需要做什么?在我看来,父进程应该是读输入,解析它,*然后*产生一个进程,如果有必要做这项工作。除了消除不必要的分支之外,它还解决了一个您可能尚未注意到的问题 - 解析不会影响shell中的任何变量,因为您正在解析子进程(并且更改子进程的状态,而不是父进程的状态,因为孩子是一个完整的其他过程,拥有自己的一切副本,并几乎无法访问父母)。 – cHao 2010-06-15 06:17:55