http://www.kernel.org/doc/man-pages/online/pages/man3/exec.3.html
#include <unistd.h>
int execve(constchar*filename,char*constargv[],char*constenvp[]); 只有此函数是系统调用。其他都是C库。
1. filename是可执行文件,或者是脚本。
1)如果是脚本,则脚本以#! interpreter [optional-arg]开始。其中interpreter为第一个参数,optional-arg为第二个参数。脚本名为第三个参数。。。
2)如果是可执行文件,则文件是第一个参数。。。
2. argv和envp字符数组都以NULL指针为结尾。
可以被“被调用的进程,即filename”通过入参访问。即int main(int argc, char *argv[], char *envp[])中后两个参数。
3. execve() 成功情况下不返回;失败情况下返回-1。
4. 调用进程的text, data, bss, and stack 被加载的程序覆盖。
5. If the current program is being ptraced, a SIGTRAP is sent to it after a successful execve().
6. 丢弃了很多父进程的配置,如
未决信号被丢弃;信号恢复默认行为,因为代码段变更;
* The dispositions of any signals that are being caught are reset to the
default (signal(7)).
* Any alternate signal stack is not preserved (sigaltstack(2)).
内存映射都被丢弃;
* Memory mappings are not preserved (mmap(2)).
* Attached System V shared memory segments are detached (shmat(2)).
* POSIX shared memory regions are unmapped (shm_open(3)).
消息队列,信号量,定时器,文件夹,内存锁被关闭;
* Open POSIX message queue descriptors are closed (mq_overview(7)).
* Any open POSIX named semaphores are closed (sem_overview(7)).
* POSIX timers are not preserved (timer_create(2)).
* Any open directory streams are closed (opendir(3)).
* Memory locks are not preserved (mlock(2), mlockall(2)).
用户空间内存存储的动作被丢弃;
* Exit handlers are not preserved (atexit(3), on_exit(3)).
* The floating-point environment is reset to the default (see fenv(3)).
进程属性被丢弃;
不带FD_CLOEXEC的文件描述符保持打开;
所有异步I/O操作被取消(aio_read(3),aio_write(3)).
For the handling of capabilities during execve(), see capabilities(7).
file descriptors 0, 1, and 2 . 一般exec前后都不关闭。
启动新进程时设置环境为C ?
还有set-user-ID and set-group-ID的影响。。。还有环境参数影响。。。
#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,
..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
应该没有execvpe和execlpe!
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
execvpe(): _GNU_SOURCE
l 表示参数为list;
v 表示参数为vector;
p 表示在默认路径查找;
e 表示引入环境变量数组;
一般情况下,路径的最后一个元素作为 arg的第一个参数。
如execl ("/bin/vi", "vi", "xxxx", NULL)或 execlp ("vi", "vi", "xxxx", NULL)
带p的表示在$PATH中查找此文件:
1)如果没有$PATH定义,则找缺省定义;
2)如果file带反斜线,则不在$PATH中查找,直接认为file是目录,在file中查找执行;
3)如果在$PATH中查找到一个文件,但没有文件访问权限,则继续查找;如果$PATH所有路径都没有,则返回EACCES错误