2017-05-10 56 views
1

我正在嘗試編寫shell,但我不明白爲什麼在createProcess函數結束後,主進程不打印此"> "。 也有更好的方法來打印來自主進程的東西嗎?我用這個if (mainPid == getpid()在函數中調用fork()後不會打印主進程

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 

void createProcess(){ 
    pid_t pid; 
    pid = fork(); 
    if (pid == 0){ 
     printf("Process created\n"); 
     printf("Child pid is %d\n", getpid()); 
    } 
} 

char *read_line(){ 
    char *line = NULL; 
    size_t bufsize = 0; 
    getline(&line, &bufsize, stdin); 
    return line; 
} 

int main(){ 
    pid_t mainPid = getpid(); 
    char* line = NULL; 
    for (;;) { 
     if (mainPid == getpid()){ 
     printf("> "); 
     line = read_line(); 
     if (line[strlen(line) - 1] == '\n') 
      line[strlen(line) - 1] = '\0'; 
     if (strcmp(line, "create") == 0) 
      createProcess(); 
     else printf("Write \"Create\"\n"); 
     } 
    } 
free(line); 
return 0; 
} 

期望輸出

> create 
Process created 
Child pid is 2417 
> 

回答

1
> create 

> Process created 

Child pid is 5655 

所以我測試了它並得到了這個^(注意「創建過程」之前的「>」)。 這意味着它只是按照您想要的順序打印出來。

編輯這是一個修復:

void createProcess(){ 
     pid_t pid; 
     pid = fork(); 
     if (pid == 0){ 
     printf("Process created\n"); 
     printf("Child pid is %d\n", getpid()); 
     exit(0); 
     } 
     if (pid > 0) { 
     int stat_loc; 
     wait(&stat_loc); 
     } 
    } 

得到這個輸出:

> create 
Process created 
Child pid is 5700 
> 
+0

我想我應該在'printf(「創建進程\ n」)之後添加一個'sleep(1)' ;' – Mattia

+0

這不會工作,因爲它不是看看它的一個過程,看看我的答案,以解決問題。 – cheemcheem

+0

謝謝我通過在main中的'createProcess()'之後添加'wait(0)'來解決問題。現在我試着瞭解你的解決方案。如果我想讓孩子進程處於活動狀態,那麼您建議使用哪種功能? – Mattia

1

你應該printf("> ")後打電話fflush(stdout),以確保字符串顯示,因爲它不以換行結束了,但stdout是行緩衝。但是,"> "可能會在子進程有機會寫入之前顯示,實際上會輸出"> Process created"

此外,子進程將在for(;;)中無限期循環,只是比較PID,所以您還應該修復該問題。

+0

是的,我可能會調用'execvp'或'退出(0)'之後'printf(「Child pid是%d \ n」,getpid())' – Mattia

1

當心,你必須在子進程有源環路,這可能會導致意想不到的副作用。

這裏是發生了什麼

for(;;) unterminated loop 
| if parent => ok first pass is parent 
| fork 
    ----------------------------- 
    | (parent)     | (child) 
    | loop as expected   | still loops! 
           | getpid() != mainPid so won't read a line 
           | and infinitely loops... 

你的循環應該是:

while (mainPid == getpid()){ // let child terminate... 
    printf("> "); 
    line = read_line(); 
    if (line[strlen(line) - 1] == '\n') 
     line[strlen(line) - 1] = '\0'; 
    if (strcmp(line, "create") == 0) 
     createProcess(); 
    else if (strcmp(line, "exit") == 0) break; // add clean exit... 
    else printf("Write \"Create\"\n"); 
    } 

鏗鏘編譯器能夠正確工作......

相關問題