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 variablep代表 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包了一些東東