注意点:
- 调用
exec
的进程会完全被新的程序替代,从新程序的main
开始执行 - process ID保持保持原来的值,因为没有创建新的进程
exec
替换了当前进程的text,data,heap,stack
segments
fork和exec的区别
fork
创建新的进程
exec
初始化新的程序
process control primitives有哪些
fork,exec,exit,wait
execl, execlp, execle, execv, execvp, execvpe - execute a file
#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execve(const char *filename, char *const argv[],
char *const envp[]);//system call
int execlp(const char *file, const char *arg, ...);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
//Reurns: -1 on error, no return on success
参数解释
file和path
- 如果
file
包含\(slash),其将被看作pathname
- 否则,可执行文件在
PATH环境变量
指定的目录中搜索
envp
传入environment list
其余的函数在调用的进程里使用全局变量environ
给新的程序复制已存在的环境。
exec family注意点:
- 如果
execlp
或execvp
通过路径找到的文件不是可执行文件,那么会认为该文件是shell script
(脚本)文件,然后将其输入到shell
中 - 函数名中
l
代表是list
,v
代表是vector
,如:execl,execlp,execle需要命令行参数是独立的参数,我们将该argument
以NULL
结尾。 p
表示使用filename
参数和PATH
环境变量来查找文件e
表示使用environment list
argument list
和enviroment list
的总大小限制
- 为
ARG_MAX
- 我们可以使用
xargs(1)
打破long argument lists
close-on-exec
每个文件描述符都有close-on-exec
flag,如果该flag
被设置,文件描述符通过exec
关闭,否则保持开启。
open directory streams调用exec
后被关闭
因为opendir
就调用了fcntl
设置了close-on-exec
flag
执行exec后从调用者进程的属性
• Process ID and parent process ID
• Real user ID and real group ID
• Supplementary group IDs
• Process group ID
• Session ID
• Controlling terminal
• Time left until alarm clock
• Current working directory
• Root directory
• File mode creation mask
• File locks
• Process signal mask
• Pending signals
• Resource limits
• Nice value (on XSI-conformant systems; see Section 8.16)
• Values for tms_utime, tms_stime, tms_cutime, and tms_cstime
effective IDs
real IDs保持不变,effective IDs取决于被执行的程序文件的set-user-ID
和set-group-ID
位。如果被设置,effective IDs会变成该程序文件的owner IDs
execve是唯一的系统调用
其余函数都是最终执行了该系统调用
下图演示exec
家族的关系: