execle, exece, execvp,execve execl, execlp的詳解



http://www.kernel.org/doc/man-pages/online/pages/man3/exec.3.html

 

#include <unistd.h>

int execve(constchar*filename,char*constargv[],char*constenvp[]); 只有此函數是系統調用。其他都是C庫。

 

1. filename是可執行文件,或者是腳本。

    1)如果是腳本,則腳本以#! interpreter [optional-arg]開始。其中interpreter爲第一個參數,optional-arg爲第二個參數。腳本名爲第三個參數。。。

     2)如果是可執行文件,則文件是第一個參數。。。

 

2. argv和envp字符數組都以NULL指針爲結尾。

    可以被“被調用的進程,即filename”通過入參訪問。即int main(int argc, char *argv[], char *envp[])中後兩個參數。

 

3. execve() 成功情況下不返回;失敗情況下返回-1。

4. 調用進程的text, data, bss, and stack 被加載的程序覆蓋。

5. If the current program is being ptraced, a SIGTRAP is sent to it after a successful execve().

 

6. 丟棄了很多父進程的配置,如

       未決信號被丟棄;信號恢復默認行爲,因爲代碼段變更;

       *      The dispositions of any signals that are being caught are reset to the
              default (signal(7)).

       *      Any alternate signal stack is not preserved (sigaltstack(2)).

      內存映射都被丟棄;

       *      Memory mappings are not preserved (mmap(2)).

       *      Attached System V shared memory segments are detached (shmat(2)).

       *      POSIX shared memory regions are unmapped (shm_open(3)).

      消息隊列,信號量,定時器,文件夾,內存鎖被關閉;

       *      Open POSIX message queue descriptors are closed (mq_overview(7)).

       *      Any open POSIX named semaphores are closed (sem_overview(7)).

       *      POSIX timers are not preserved (timer_create(2)).

       *      Any open directory streams are closed (opendir(3)).

       *      Memory locks are not preserved (mlock(2), mlockall(2)).

      用戶空間內存存儲的動作被丟棄;

       *      Exit handlers are not preserved (atexit(3), on_exit(3)).

       *      The floating-point environment is reset to the default (see fenv(3)).

     進程屬性被丟棄;

      不帶FD_CLOEXEC的文件描述符保持打開;

      所有異步I/O操作被取消(aio_read(3),aio_write(3)).

      For the handling of capabilities during execve(), see capabilities(7).

      file descriptors 0, 1, and 2 一般exec前後都不關閉。

      啓動新進程時設置環境爲C ?

      還有set-user-ID and set-group-ID的影響。。。還有環境參數影響。。。

 

 

#include <unistd.h>

       extern char **environ;

       int execl(const char *path, const char *arg, ...);
       int execlp(const char *file, const char *arg, ...);
       int execle(const char *path, const char *arg,
                  ..., char * const envp[]);
       int execv(const char *path, char *const argv[]);
       int execvp(const char *file, char *const argv[]);
       應該沒有execvpe和execlpe!

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       execvpe(): _GNU_SOURCE

 

l 表示參數爲list;

v 表示參數爲vector;

p 表示在默認路徑查找;

e 表示引入環境變量數組;

一般情況下,路徑的最後一個元素作爲 arg的第一個參數。

如execl ("/bin/vi", "vi", "xxxx", NULL)或 execlp ("vi", "vi", "xxxx", NULL)

 

帶p的表示在$PATH中查找此文件:

1)如果沒有$PATH定義,則找缺省定義;

2)如果file帶反斜線,則不在$PATH中查找,直接認爲file是目錄,在file中查找執行;

3)如果在$PATH中查找到一個文件,但沒有文件訪問權限,則繼續查找;如果$PATH所有路徑都沒有,則返回EACCES錯誤


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章