exec

Header Files

#include <unistd.h>

Function Prototype

int execl(const char *pathname, const char *arg0, /* (char *) 0 */);
int execv(const char *pathname, char *const argv[]);
int execle(const char *pathname, const char *arg0, /* (char *) 0, char *const envp[] */);
int execve(const char *pathname, char *const argv[], char *const envp[]);
int execlp(const char *filename, const char *arg0, /* (char *) 0 */);
int execvp(const char *filename, , char *const argv[]);
  • l 代表 list,v 代表 vector,這只是代表參數的不同表現方式
  • e 代表 environment variable
  • p 代表 path,詳細自己查,和 environment variable 的 PATH 有關

Function

簡單版:讓 process 去跑別的 program

細節版:將 virtual memory 中 text segment (read-only) 替換成別的 program,並且由此也會改變 virtual memory 的其他部分(詳見 virtual memory)

Inheritance

大部分都會繼承,除了 open dir streams (用opendir打開的) 而 effective UID/GID 也會繼承,但如果新 program 有 set-uid/gid 的話就會被新 program 的覆蓋掉

FD_CLOEXEC

這是 fcntl 的一個 cmd,我們可以用它來開啟或關閉在 file descriptor 的 close-on-exec flag,這個 flag 會決定 exec 後新的 program 會不會繼承 file descriptor

Remark

flowchart TD
    execlp[execlp]
    execl[execl]
    execle[execle]
    execvp[execvp]
    execv[execv]
    execve[execve]
    
    execlp -->|build argv| execvp
    execvp -->|try each<br/>PATH prefix| execv
    execl -->|build argv| execv
    execv -->|use<br/>environ| execve
    execle -->|build argv| execve
  • 這六個指令實際上都只是 execve 包了一些東東