我正在编写一个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)只是我在那里忘记玩的东西
- 在打印件上添加换行符表明它确实正确地分叉并进入子进程;谢谢,问题似乎在解析
答案 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)
对于所有嵌套的if
和else
来说,你的核心有点混乱。还有一些悬空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
数组在第一次运行时将是垃圾,因为在分叉之前你没有放任何东西。
叉子似乎完全没有意义,因为你没有在孩子身上做任何事情,但是你正在等待孩子在父母身上完成任务。为什么不从父母那里调用解析?