我正在寫一個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一個換行符到打印忘了還有表明,它實際上正確分叉並進入子進程;謝謝你,這個問題似乎是在解析
如果您在打印PID的語句中添加了換行符,您可能會看到子pid爲零。 – 2010-06-15 05:40:31
只是想知道......你爲什麼在分手之前知道你需要做什麼?在我看來,父進程應該是讀輸入,解析它,*然後*產生一個進程,如果有必要做這項工作。除了消除不必要的分支之外,它還解決了一個您可能尚未注意到的問題 - 解析不會影響shell中的任何變量,因爲您正在解析子進程(並且更改子進程的狀態,而不是父進程的狀態,因爲孩子是一個完整的其他過程,擁有自己的一切副本,並幾乎無法訪問父母)。 – cHao 2010-06-15 06:17:55