execve, execl, execlp, execle, exece, execvp

来源:互联网 发布:淘宝设置尹流量佣金 编辑:程序博客网 时间:2024/04/28 16:12

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错误

原创粉丝点击