linux手册翻译 execve

名称

execve - 执行程序

简介

#include <unistd.h>

int execve(const char *pathname, char *const argv[], char *const envp[]);

描述

execve() 执行由参数 pathname指定的程序. 这将导致调用进程当前正在运行的程序被一个新程序替换,该程序具有新初始化的堆栈、堆和(初始化和未初始化的)数据段。
参数pathname必须也是一个可执行的二进制文件, 或者是一个 #!interpreter [optional-arg] 形式的脚本. 详情见下面 “Interpreter scripts” 部分.

参数 argv 一组指向字符串的指针的数组. 这些字符串作为命令行参数传递给新程序. 按照惯例,这些字符串中的第一个(即argv[0])应该包含与正在执行的文件相关联的文件名。argv数组必须以NULL指针结束。(因此,在新程序中,argv[argc]将为NULL。)

参数envp也是一组指向字符串的指针的数组, 他们以key=value的传统形式, 作为环境变量传递给新策划功能性. envp数组必须以NULL指针作为结尾.

实参vector和environment可以被新程序的main函数访问,当它被定义为:

int main(int argc, char *argv[], char *envp[])

但是请注意,POSIX.1中没有指定使用main函数的第三个参数;根据POSIX.1,应该通过外部变量environ(7)来访问环境。
execve()执行成功后不返回. 调用程序的代码, 初始化的数据, 未初始化的数据(bss), 和栈会根据新加载的程序的内容被覆盖掉.

如果当前程序正在被跟踪(traced),则在成功执行execute()之后向它发送一个SIGTRAP信号。
如果在pathname所引用的程序文件上设置了set-user-ID位,则调用进程的有效用户ID将更改为程序文件所有者的用户ID。同样,如果在程序文件上设置了set-group-ID位,则调用进程的有效组ID将设置为程序文件的组。
如果满足以下任何一个条件,则不执行上述有效id的转换(即忽略set-user-ID和set-group-ID位):

  • 调用的线程设置了 no_new_privs 属性(见 prctl(2))
  • 潜在的文件系统被挂载为( MS_NOSUID flag for mount(2))
  • 调用的进程在被跟踪.

如果上述任何一个为真,程序文件的功能(参见capabilities(7))也会被忽略。

将进程的有效用户ID复制到保存的set-user-ID中;同样,将有效的组ID复制到保存的set-group-ID中。这种复制发生在由于set-user-ID和set-group-ID模式位而发生的任何有效ID更改之后。

进程的实际UID和实际GID,以及它的补充组id,通过调用execute()来改变。

如果可执行文件是包含共享库stubs的a.out动态链接的二进制可执行文件,则在执行开始时调用Linux动态链接器ld.so(8),将所需的共享对象带入内存并将可执行文件与它们链接起来。

如果可执行文件是动态链接的ELF可执行文件,则使用PT_INTERP段中命名的解释器来加载所需的共享对象。这个解释器通常是**/lib/ld-linux.so**。2链接到glibc的二进制文件(参见ld-linux.so(8))。

进程属性的作用

在执行execve()期间,所有进程属性都被保留,除了以下属性:

  • 被捕获的任何信号的配置被重置为默认值(signal(7))。
  • 任何可选的信号堆栈都不会被保留(sigaltstack(2))。
  • 内存映射不会被保留(mmap(2)).
  • 附加的System V共享内存段被分离(shmat(2))。
  • POSIX 共享内存区域被解除映射 (shm_open(3)).
  • 打开的POSIX消息队列描述被关闭 (mq_overview(7)).
  • 任何打开的POSIX命名信号量都是关闭的(sem_overview
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值