2015-02-07 31 views
3

我提前道歉,如果這是一個愚蠢的問題,但更深層的我鑽研它越糊塗的我。我自學C,最近一直在研究文件「open」的相關函數和宏,以便更好地理解究竟發生了什麼。bash使用什麼來打開/執行argv [0]?

所以,我的愚蠢的問題是,運行Centos的6.6和使用Bash shell的系統,究竟打開的argv [0]執行程序的情況下從命令提示符調用呢?

我已經嘗試過(我認爲被稱爲)攔截程序,並通過LD_PRELOAD指令導出共享對象文件,並且可以跟蹤至少一些調用「open」和「open64」。

我使用的調試樣式打印語句給我打開的文件名,但我注意到從命令行(我假定爲argv [0])調用的程序不會顯示爲被引用通過這些之一。

這使我開始通過慶典源苦讀,並沒有得到任何實際進展。

我倒是十分欣賞什麼我可能需要尋找並在任何指針?我已經grep'ed上的argv,argv(包含主(,execev,IOCTL和fcntl,一派搜查留言板,但我不會取得進展。

我倒是十分欣賞這個任何意見或指針。

+3

'exec *'函數族是你想要跟蹤的。執行一個文件並打開它是兩件完全不同的事情。 – Mat 2015-02-07 20:05:51

+2

shell'fork'是一個新進程和'exec'文件,所以它根本不涉及'open'。 – 2015-02-07 20:06:29

+1

函數的'exec *()'系列負責讀取指定爲第一個參數的文件。您不會看到單獨的用戶級別的打開操作;它由內核在內部處理。 – 2015-02-07 21:29:49

回答

5

獲取源bash(注:這不是一個簡單的外殼 - 這是一個非常複雜的程序):

  • git clone git://git.savannah.gnu.org/bash.git

看看文件execute_cmd.c和功能。和shell_execve()

基本上execute_disk_command()執行fork()(經由輔助函數make_child()後跟execve()(經由shell_execve())。

+2

如果您想在線瀏覽它,請使用外部參照:http://code.metager.de/source/xref/gnu/bash/execute_cmd.c#5192和http://code.metager.de/source/xref/gnu /bash/execute_cmd.c#4845 – myaut 2015-02-07 22:25:32

3

最終,execve()爲所有程序調用的入口點(上符合POSIX的平臺),它指示操作系統運行的裝載機,其準備執行新的方案,並最終使之成爲運行狀態(和它留給自己)提供的execve()的一個參數是一個字符串 - 文件系統路徑指向可執行文件在磁盤上。按照慣例,argv的[0]被設置爲相應的基名*的參數被放置在新生成的節目的棧,因此THA它可以訪問它們。

參見http://linux.die.net/man/2/execve

INT的execve(常量字符*文件名,char * const的的argv [],char * const的 envp []);

execve()執行指向的程序文件名。文件名必須是 任一個二進制可執行或腳本開始一個線的 形式:

#! interpreter [optional-arg] 

argv的是傳遞到新程序參數字符串數組。通過 約定,這些字符串中的第一個字符串應包含與正在執行的文件關聯的文件名 。

+0

可執行文件和argv [0]的路徑不一定是相同的。這是傳統的,但可以運行文件A並告訴它它的argv [0]是B. – 2015-02-08 17:49:58

+0

當然,我應該澄清一點。將更新答案。 – 2015-02-08 18:06:51

+0

編輯 - 特別是手冊頁報價 - 這現在是權威的;喝彩。 – 2015-02-08 18:32:27