2014-09-01 13 views
0

我的問題是:在完成新的進程映像的執行,功能execl的回報 - Ubuntu的

EXECL()後

將執行返回給調用進程或父親處理?

+1

兩者都不;父母的過程繼續其快樂的方式,無論孩子做什麼(除非父母決定等待孩子死亡)。祖父母不知道它的孫子。任何'exec *()'函數返回的唯一時間是失敗。 – 2014-09-01 02:47:11

+0

謝謝。我認爲任何時候函數被孩子調用時,execl函數都會返回到「父親」進程。 – almanegra 2014-09-01 02:52:07

回答

2

當使用exec系列函數之一時,不希望函數返回。程序計數器從取代調用進程的二進制映像的第一條指令開始。

從達爾文手冊頁:

如果任何EXEC()函數返回時,會發生錯誤。 返回值是-1,全局變量errno將被設置爲 指示錯誤。

有評論詢問以下,但它已被刪除:

如果你是在一個子進程,並execl成功,那麼孩子的過程是由新的二進制取代。如果失敗,則控制返回到該子進程(調用者)。如果這就是你要求的,forkexec之間沒有嚴格的關係。如果您處於子進程中,並且exec失敗,那麼您有一個「分叉」子進程,它是原始父進程的副本。此時您可能想要打印一些錯誤消息並退出子進程。

如果你想知道爲什麼它失敗了,你可以使用下面的模式:

if (execl(...)) { 
    perror(NULL); 
    exit(errno); 
} 

例如,嘗試運行此程序,錯誤信息將顯示如何修復程序:

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

int main (const int argc, char * const argv[]) { 
    if (execl("ls", "ls", "-la", NULL)) { 
     perror(NULL); 
     exit(errno); 
    } 

    return 0; 
} 

解決方案,在這種情況下使用execlp而不是execl

+0

是的,我刪除了它,因爲我正在寫一個新的:)謝謝 – almanegra 2014-09-01 02:50:05