Linux exec简介

来源:互联网 发布:ruby windows 编辑:程序博客网 时间:2024/06/05 11:28

exec系列函数简介

fork子进程之后,子进程要调用exec系列函数执行程序,这个调用用新程序替换了当前进程的正文段、数据段、堆段、栈段。

#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 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[]);

第一个参数为path的是需要加路径
第一个参数为filename的是在PATH环境变量中搜索

执行exec后,进程ID没有变。新程序从调用的子进程继承了下面属性:
进程ID和父进程ID
实际用户ID和实际组ID
附属组ID
进程组ID
回话ID
等等

下面写个程序,进行简单验证,代码也可以:github

#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <unistd.h>#include <sys/time.h>#include <malloc.h>int main(int argc, char **argv){    pid_t pid;    if((pid=fork())<0)    {        printf("fork error\r\n");        return -1;    }    else if(pid == 0)    {        printf("child  pid = %ld\r\n",(long)getpid());        printf("child  uid = %ld\r\n",(long)getuid());        printf("child  gid = %ld\r\n",(long)getgid());    //  execl("/bin/ls", "ls", "-l", (char *)0);        execlp("ls", "ls", "-l", (char *)0);    }    else    {        int stat;        pid_t pid=wait(&stat);        printf("child terminate pid = %ld\r\n",(long)pid);        printf("child terminate uid = %ld\r\n",(long)getuid());        printf("child terminate gid = %ld\r\n",(long)getgid());    }    return 0;}
原创粉丝点击