2011-04-22 79 views
0

我被授予該項目的啓動代碼,但難以理解子程序如何執行。瞭解子代程序在此代碼中的執行方式

int pid ; 
int child_info = -1; 

if (argv[0] == NULL)  /* nothing succeeds */ 
    return 0; 

if((pid= fork()==-1) 
    perror("fork"); 

else if (pid == 0){ 

    signal(SIGINT, SIG_DFL); 
    signal(SIGQUIT, SIG_DFL); 
    execvp(argv[0], argv); 
    perror("cannot execute command"); 
    exit(1); 
} 
else { //check if wait error or print out exit status 
    if (wait(&child_info) == -1) 
    perror("wait"); 
    else { 
    printf("Exit status: %d, %d\n", child_info>>8, child_info&0377); 
} 
    } 
    return child_info; 
} 

看代碼,當前進程叉,在這種情況下,孩子都繼承父進程的相關性,因爲不涉及定時器,信號或任何東西。但是,新進程的pid值在18000範圍內,所以如何執行execvp(argv[0], argv),因爲在這種情況下,pid!= 0.

+0

我不明白你的問題...... – 2011-04-22 02:20:14

回答

3

從細手冊fork

成功完成後,叉()應返回0給子過程,並應子進程的進程ID返回給父進程。

if的第一個分支是一個錯誤條件,如果發生錯誤,它將在父進程中執行。第二個分支(pid == 0)在子​​進程中執行,孩子做了一些信號管理並執行exec。沒有錯誤時,第三個分支位於父項中。

在父項中,pid將爲非零,但在新的子項過程中,pid將爲零。

+0

這就是我所缺少的。 – Jason 2011-04-22 02:26:28

1

只有一個新的過程被創建;孩子。

fork()在子進程中返回0,這就是你要檢查的內容。

fork()在父進程(您的原始進程)中返回子進程的PID。

通過檢查fork()0的回報,你知道你是父母還是孩子;如果是0,那麼你就是這個孩子。

1

Fork返回子進程的父進程和0子進程。所以當詢問pid == 0意味着「這是孩子的過程?」。如果是這樣,它會執行通過命令行參數傳遞的程序。