叉的问题

叉的问题

问题描述:

我正在写一个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一个换行符到打印忘了还有表明,它实际上正确分叉并进入子进程;谢谢你,这个问题似乎是在解析

+0

如果您在打印PID的语句中添加了换行符,您可能会看到子pid为零。 – 2010-06-15 05:40:31

+0

只是想知道......你为什么在分手之前知道你需要做什么?在我看来,父进程应该是读输入,解析它,*然后*产生一个进程,如果有必要做这项工作。除了消除不必要的分支之外,它还解决了一个您可能尚未注意到的问题 - 解析不会影响shell中的任何变量,因为您正在解析子进程(并且更改子进程的状态,而不是父进程的状态,因为孩子是一个完整的其他过程,拥有自己的一切副本,并几乎无法访问父母)。 – cHao 2010-06-15 06:17:55

的罪魁祸首之一是else exit(0);

这会在孩子的外壳,这意味着它不会继续执行分析阶段执行。该代码在语法上也是无效的,因为在此之后,您还有另外

+0

'这很有意思 - 显示的代码不会编译;在这个时刻之前的其他人没有一个,如果它属于,是吗? – 2010-06-15 05:38:07

+0

在我看来,这是一个尝试调试的东西。该代码甚至不会在编译时留下,所以它可能被添加到以显示迄今为止已完成的工作,但其他内容未被注释掉。 – cHao 2010-06-15 05:51:35

你的核心与所有嵌套的ifelse都是混乱的。还有一些悬挂的else陈述(else exit(0);)。我会开始清理这些。我看不到任何其他的代码逻辑问题。这很简单。

交换线路

else exit(0); 

else { if (parse(input) != 0 && firstrun != 1) { printf("Error parsing"); exit(-1); } exit(0); } 
+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数组将在第一次运行时被垃圾回收,因为在分岔之前没有放入任何东西。

看起来叉子根本没有意义,因为你没有在孩子身上做任何事情,但你正在等待孩子在父母身上完成。为什么不从父级调用解析?