exec Function

注意点:

  1. 调用exec的进程会完全被新的程序替代,从新程序的main开始执行
  2. process ID保持保持原来的值,因为没有创建新的进程
  3. exec替换了当前进程的text,data,heap,stacksegments

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

  1. 如果file包含\(slash),其将被看作pathname
  2. 否则,可执行文件在PATH环境变量指定的目录中搜索

envp

传入environment list
其余的函数在调用的进程里使用全局变量environ给新的程序复制已存在的环境。

exec family注意点:

  1. 如果execlpexecvp通过路径找到的文件不是可执行文件,那么会认为该文件是shell script(脚本)文件,然后将其输入到shell
  2. 函数名中l代表是listv代表是vector,如:execl,execlp,execle需要命令行参数是独立的参数,我们将该argumentNULL结尾。
  3. p表示使用filename参数和PATH环境变量来查找文件
  4. e表示使用environment list

argument listenviroment list的总大小限制

  1. ARG_MAX
  2. 我们可以使用xargs(1)打破long argument lists

close-on-exec

每个文件描述符都有close-on-exec flag,如果该flag被设置,文件描述符通过exec关闭,否则保持开启。

open directory streams调用exec后被关闭

因为opendir就调用了fcntl设置了close-on-execflag

执行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-IDset-group-ID位。如果被设置,effective IDs会变成该程序文件的owner IDs

execve是唯一的系统调用

其余函数都是最终执行了该系统调用

下图演示exec家族的关系:
figure 8.15

Example:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值