2010-03-27 70 views
0

我正試圖在另一個進程中創建一個子進程。我正在用C語言編寫這兩個程序。首先我寫一個虛擬的過程,這將是孩子的過程。它所做的只是在屏幕上寫一個字符串。它獨立運作。然後我編寫另一個程序,這將是父進程。但是,我無法做到這一點。我試圖一起使用fork和execl函數,但是我失敗了。我也希望子進程不會終止,直到父進程終止。在Unix系統上創建子進程?

我應該如何編寫父進程?

謝謝。

這裏是子進程的代碼:

#include <stdio.h> 

int main(void) { 
    while(1) { 
    printf("*"); 
    sleep(1); 
    } 
} 

這裏是父進程:

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

int main(void) { 
    if (fork()) { 
    while(1) { 
     printf("-\n"); 
     sleep(5); 
    } 
    } else { 
    execl("./", "dummy", (char *)0); 
    } 
} 
+1

你說你「失敗」,但你沒有顯示任何代碼。你如何期待我們告訴你做錯了什麼?另外,父進程管理子進程,所以子進程總是在父進程之前完成。如果父進程先死了,那麼祖父會採用子進程(最高爲/ sbin/init,所有進程的最高祖父進程,永遠不會死掉)。 – Juliano 2010-03-27 23:03:16

+0

好吧,對不起,我用代碼編輯了我的問題。 – 2010-03-27 23:09:45

+1

在execl語句後添加一個perror(「execl」),看看會發生什麼。 – Duck 2010-03-27 23:54:19

回答

6

fork()系統調用可能返回三種不同的狀態:失敗(< 0),父進程(> 0)或子進程(== 0)。您必須正確測試返回值。

int pid = fork(); 

if (pid < 0) { 
    /* handle error */ 
    perror("fork"); 
    exit(1); 
} else if (pid > 0) { 
    /* parent code */ 
} else { 
    /* child code */ 
} 

您的execl()系統調用錯誤。第一個參數是要執行的程序的路徑,「./」無效,至少應該是「./dummy」。下一個參數是慣例中的命令名稱(被執行的程序中的argv [0]),它可能是第一個參數的重複。所以:

execl("./dummy", "dummy", NULL); 

另外,還要注意在兒童節目printf("*")聲明可能會緩衝,你不會看到終端上的任何東西。您必須在最後添加「\ n」或致電fflush(stdout)來刷新標準輸出。

+0

+1是的,幾乎肯定execl的權限錯誤。 – Duck 2010-03-27 23:53:10

+0

感謝您的回覆,它對我有很大的幫助。 – 2010-03-28 10:33:23

1

用C基本使用fork

int PID = fork(); 

if(PID < 0) { 
    //fail 
    return PID; 
} 
else if(!PID) { 
    //child process 
    return exec(prog, args); 
} 
else { 
    //parent process 
    return 0; 
} 
+1

是的,父進程將退出,即使它的一些子/後代仍然存在。如果父母想等他們,那就必須故意這樣做。 – MarkR 2010-03-27 23:12:55

0

沒有強制子進程在完成時「不終止」的方式(您仍然可以在父進程中爲wait獲取有關它如何終止的信息,但這就是它)。除此之外,網絡上fork/exec的許多示例中的任何一個(例如this one)都應該有效 - 您爲什麼不嘗試它並查看它是否按照您的意願執行(在這種情況下,您只需要在你自己的嘗試中改變你所做的不同的事情)。如果它不能按需要工作(除了這個A中第一句的不可能性;-),請編輯您的代碼以添加有關代碼行爲與預期不同的詳細信息。

+0

您可以在子進程完成其工作後但在退出之前將循環放入子進程中,等待父進程死掉(例如,通過等待連接到父進程的管道上的「EOF」)。 – caf 2010-03-28 02:14:46

+0

如果您控制子進程的源代碼,請不要有任何錯誤,並且可以以某種方式保證它不會收到不受歡迎的信號,是的,但這些可能是很難保證的。 – 2010-03-28 02:24:33