问题与fork()

我正在写一个分支的shell,父母读取input和subprocessparsing,并用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; 

发生什么事情是,我似乎从来没有进入subprocess(PID打印总是积极的,我从来没有进入其他)。 然而,如果我不调用parsing函数,只是有其他退出,我确实正确地input父母和孩子交替。

 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)只是我忘了从那里玩

添加一个换行符,显示它确实正确地分叉并inputsubprocess; 谢谢,这个问题似乎是在parsing

一个罪魁祸首就是else exit(0);

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

if(p> = 0){

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

} else {

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

}`

我会像上面的伪代码那样做。

else exit(0); 是子进程在您的代码中执行的操作。

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

交换线路

 else exit(0); 

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

除了其他人所说的其他事情都是一团糟之外,还有一些其他的问题会在你修好之后发生。

在子节点中, input数组在第一次运行时将被垃圾回收,因为在分叉之前不会放入任何东西。

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