2010-06-15 82 views
2

我正在寫一個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

回答

1

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

這會在孩子的外殼,這意味着它不會繼續執行分析階段執行。該代碼在語法上也是無效的,因爲在此之後,您還有另外

+0

'這很有意思 - 顯示的代碼不會編譯;在這個時刻之前的其他人沒有一個,如果它屬於,是嗎? – 2010-06-15 05:38:07

+0

在我看來,這是一個嘗試調試的東西。該代碼甚至不會在編譯時留下,所以它可能被添加到以顯示迄今爲止已完成的工作,但其他內容未被註釋掉。 – cHao 2010-06-15 05:51:35

0

你的核心與所有嵌套的ifelse都是混亂的。還有一些懸掛的else陳述(else exit(0);)。我會開始清理這些。我看不到任何其他的代碼邏輯問題。這很簡單。

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

1

`如果(P> = 0){

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

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

}否則{

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

}`

我會這樣做,就像上面的僞代碼。

else exit(0);是子進程在您的代碼中執行的操作。

0

除了其他人已經說過的其他事情都是一團糟的事情之外,還有一些其他問題會在你修復它們時遇到。

在孩子中,input數組將在第一次運行時被垃圾回收,因爲在分岔之前沒有放入任何東西。

看起來叉子根本沒有意義,因爲你沒有在孩子身上做任何事情,但你正在等待孩子在父母身上完成。爲什麼不從父級調用解析?