我正在写一个分支的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);
是子进程在您的代码中执行的操作。
你的核心对所有嵌套的if
和else
都是一团糟。 还有一些悬而未决的陈述( else exit(0);
)。 我会开始清理这些。 我看不到任何其他的代码逻辑问题。 这很简单。
交换线路
else exit(0);
和
else { if (parse(input) != 0 && firstrun != 1) { printf("Error parsing"); exit(-1); } exit(0); }
除了其他人所说的其他事情都是一团糟之外,还有一些其他的问题会在你修好之后发生。
在子节点中, input
数组在第一次运行时将被垃圾回收,因为在分叉之前不会放入任何东西。
看起来叉子根本没有意义,因为你没有在孩子身上做任何事情,而是等着孩子在父母身上完成。 为什么不从父级调用解析呢?