linux exec函数族

fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的”副本”,这意味着父子进程间不共享这些存储空间.linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间),也就是这两个进程做完全相同的事。

在fork后的子进程中使用exec函数族,可以装入和运行其它程序(子进程替换原有进程,和父进程做不同的事)

fork创建一个新的进程就产生一个新的PID,exec启动一个新程序,替换原有的进程,因此这个新的被exec执行的进程的PID不会改变(和调用exec的进程的PID一样)

exec函数族:

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[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);

函数返回值

成功则不返回,失败返回-1,失败原因存于errno中.

在exec函数族中,后缀 l、v、 p、 e 指定函数将具有某种操作能力

示例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    //以NULL结尾的字符串数组的指针,适合包含v的exec函数参数
    char *arg[] = {"ls", "-a", NULL};

    /**
     * 创建子进程并调用函数execl
     * execl 中希望接收以逗号分隔的参数列表,并以NULL指针为结束标志
     */
    if( fork() == 0 ) {
        // in clild
        printf( "1------------execl------------\n" );
        if( execl( "/bin/ls", "ls","-a", NULL ) == -1 ) {
            perror( "execl error " );
            exit(1);
        }
    }

    /**
     *创建子进程并调用函数execv
     *execv中希望接收一个以NULL结尾的字符串数组的指针
     */
    if( fork() == 0 ) {
        // in child
        printf("2------------execv------------\n");
        if( execv( "/bin/ls",arg) < 0) {
            perror("execv error ");
            exit(1);
        }
    }

    /**
     *创建子进程并调用 execlp
     *execlp中
     *l希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志
     *p是一个以NULL结尾的字符串数组指针,函数可以DOS的PATH变量查找子程序文件
     */
    if( fork() == 0 ) {
        // in clhild
        printf("3------------execlp------------\n");
        if( execlp( "ls", "ls", "-a", NULL ) < 0 ) {
            perror( "execlp error " );
            exit(1);
        }
    }

    /**
     *创建子里程并调用execvp
     *v 望接收到一个以NULL结尾的字符串数组的指针
     *p 是一个以NULL结尾的字符串数组指针,函数可以DOS的PATH变量查找子程序文件
     */
    if( fork() == 0 ) {
        printf("4------------execvp------------\n");
        if( execvp( "ls", arg ) < 0 ) {
            perror( "execvp error " );
            exit( 1 );
        }
    }

    /**
     *创建子进程并调用execle
     *l 希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志
     *e 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境
     */
    if( fork() == 0 ) {
        printf("5------------execle------------\n");
        if( execle("/bin/ls", "ls", "-a", NULL, NULL) == -1 ) {
            perror("execle error ");
            exit(1);
        }
    }

    /**
     *创建子进程并调用execve
     * v 希望接收到一个以NULL结尾的字符串数组的指针
     * e 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境
     */
    if( fork() == 0 ) {
        printf("6------------execve-----------\n");
        if( execve( "/bin/ls", arg, NULL ) == 0) {
            perror("execve error ");
            exit(1);
        }
    }
    return EXIT_SUCCESS;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 01:50:58

linux exec函数族的相关文章

Linux进程控制——exec函数族

原文:http://www.cnblogs.com/hnrainll/archive/2011/07/23/2114854.html 1.简介 在Linux中,并不存在exec()函数,exec指的是一组函数,一共有6个,分别是: #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char

Linux系统编程——进程替换:exec 函数族

在 Windows 平台下.我们能够通过双击运行可运行程序.让这个可运行程序成为一个进程:而在 Linux 平台.我们能够通过 ./ 运行,让一个可运行程序成为一个进程. 可是,假设我们本来就执行着一个程序(进程),我们怎样在这个进程内部启动一个外部程序.由内核将这个外部程序读入内存,使其执行起来成为一个进程呢?这里我们通过 exec 函数族实现. exec 函数族.顾名思义.就是一簇函数,在 Linux 中,并不存在 exec() 函数.exec 指的是一组函数.一共同拥有 6 个: [cpp

Linux进程实践(3) --进程终止与exec函数族

进程的几种终止方式 (1)正常退出 从main函数返回[return] 调用exit 调用_exit/_Exit (2)异常退出 调用abort   产生SIGABOUT信号 由信号终止  Ctrl+C [SIGINT] ...(并不完全, 如return/pthread_exit等) 测试[exit/_exit] //尝试查看该程序的打印输出 int main() { cout << "In main, pid = " << getpid(); //去掉了en

(转载)Linux进程控制——exec函数族

1.简介 在Linux中,并不存在exec()函数,exec指的是一组函数,一共有6个,分别是: #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, ..., cha

Linux多任务编程之三:exec函数族及其基础实验(转)

来源:CSDN  作者:王文松  转自:Linux公社 exec函数族 函数族说明 fork() 函数用于创建一个新的子进程,该子进程几乎复制了父进程的全部内容,但是,这个新创建的子进程如何执行呢?exec 函数族就提供了一个在进程中启动另一个程序执行的方法.它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段.代码段和堆栈 段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了.另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执 行

exec函数族实例解析

fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本,它将获得父进程数据空间.堆.栈等资源的副本.注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间.linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间.),也就是这两个进程做完全相同的事. 在fork后的子进程中使用exec函数族,可以装入和运行其它程序(子进程替换原有进程,和父进程做不同的事). fork创建一个新的进程就产生了一个新的PID,e

exec函数族

Linux中,exec函数族有6种不同的调用的形式,它们声明在<unistd.h>头文件中,6个函数如下: #include <unistd.h> int execve(const char *path,char* const argv[],char* const envp[]); int execv(const char *path,char* const envp[]); int execle(const char *path,const char *arg,...); int

exec函数族,守护进程,线程同步和互斥

2015.3.2 进程和程序有三点不同:1,存在位置不同,程序:硬盘,磁盘.进程:内存2. 程序是静态的,进程是动态的 执行./a.out -->bash->bash程序调用fork()-->子进程将./a.out后面的参数存放到argv[].然后调用exec处理这些参数,最后子进程退出,光标闪动 进程进入停止态:1,调试的时候,2,将前台变成后台运行 线程:每个程序加载到内存后可以对应创建一个或多个顺序执行流(能使进程在同一时刻做不止一件事,每个线程处理各自独立的任务) 回调函数 同步

linux exec用法总结

Linux中exec的用法总结 先总结一个表: exec命令 作用 exec ls 在shell中执行ls,ls结果显示结束后不返回原来的的目录中,而是/(根目录) exec <file 将file中的内容作为exec的标准输入 exec >file 将file中的内容作为标准写出 exec 3<file 将file读入到fd3中 sort <&3 fd3中读入的内容被分类 exec 4>file 将写入fd4中的内容写入file中 ls >&4 Ls将