exec函数族

1 exec函数族

1.1 函数介绍

常用后缀:

  • l:代表以列表形式传参(list)
  • v:代表以矢量数组形式传参(vector)
  • p:代表使用环境变量Path来寻找指定执行文件
  • e:代表用户提供自定义的环境变量

头文件:

#include <unistd.h>

函数原型:

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 execve(const char *path, char *const argv[], char *const envp[]);

返回值:

  • 成功:不返回
  • 失败:-1

1.2 函数测试

函数execl:

int execl(const char *path, const char *arg, ...);

execl()函数用于执行参数path字符串所代表的文件路径(必须指定路径),接下来是一系列可变参数,它们代表执行该文件时传递过去的 argv[0]、argv[1]… argv[n] ,最后一个参数必须用空指针NULL作为结束的标志。

int main(void)
{
    int err;

    printf("this is a execl function test demo!\n\n");

    err = execl("/bin/ls", "ls", "-la", NULL);

    if (err < 0) {
        printf("execl fail!\n\n");
    }

    printf("Done!\n\n");
}

函数execlp:

int execlp(const char *file, const char *arg, ...);

execlp()函数会从PATH环境变量所指的目录中查找符合参数file的文件名(不需要指定路径),找到后便执行该文件,然后将第二个以后的参数当做该文件的 argv[0]、argv[1]… argv[n] , 最后一个参数必须用空指针NULL作为结束的标志。

int main(void)
{
    int err;

    printf("this is a execlp function test demo!\n\n");

    err = execlp("ls", "ls", "-la", NULL);

    if (err < 0) {
        printf("execlp fail!\n\n");
    }
}

函数execle:

int execle(const char *path, const char *arg, ..., char *const envp[]);

execle()函数用于执行参数path字符串所代表的文件路径(必须指定路径),并为新程序复制最后一个参数所指示的环境变量(envp)。

int main(void)
{
    int err;
    char *envp[] = {
        "/bin", NULL
    };

    printf("this is a execle function test demo!\n\n");

    err = execle("/bin/ls", "ls", "-la", NULL, envp);

    if (err < 0) {
        printf("execle fail!\n\n");
    }
}

函数execv:

int execv(const char *path, char *const argv[]);

execv()函数用于执行参数path字符串所代表的文件路径(必须指定路径),接着传入一个数组作为执行该文件时传递过去的参数 argv[0]、argv[1]… argv[n] ,以空指针NULL结束。

int main(void)
{
    int err;
    char *argv[] = {
        "ls", "-la", NULL
    };

    printf("this is a execv function test demo!\n\n");

    err = execv("/bin/ls", argv);

    if (err < 0) {
        printf("execv fail!\n\n");
    }
}

函数execvp:

int execvp(const char *path, char *const argv[]);

execvp()函数会从PATH环境变量所指的目录中查找符合参数file的文件名(不需要指定路径),找到该文件后便执行该文件,接着传入一个数组作为执行该文件时传递过去的参数 argv[0]、argv[1] … argv[n] ,以空指针NULL结束。

int main(void)
{
    int err;
    char *argv[] = {
        "ls", "-la", NULL
    };

    printf("this is a execvp function test demo!\n\n");

    err = execvp("ls", argv);

    if (err < 0) {
        printf("execvp fail!\n\n");
    }
}

函数execve:

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

execve()函数用于执行参数path字符串所代表的文件路径(必须指定路径),执行该文件时会传入一个数组作为执行该文件时传递过去的参数 argv[0]、argv[1] … argv[n] ,除此之外该函数还会为新程序复制最后一个参数所指示的环境变量(envp)。

int main(void)
{
    int err;
    char *argv[] = {
        "ls", "-la", NULL
    };
    char *envp[] = {
        "/bin", NULL
    };

    printf("this is a execve function test demo!\n\n");

    err = execve("/bin/ls", argv, envp);

    if (err < 0) {
        printf("execve fail!\n\n");
    }
}

1.3 要点总结

要点:

  • l后缀和v后缀必须两者选其一来使用
  • p后缀和e后缀是可选的,可用可不用
  • 组合后缀的相关函数还有很多,可自己进一步了解

exce函数有可能执行失败,需要预防:

  • 新程序的文件路径出错
  • 传参或者是自定义环境变量时,没有加NULL
  • 新程序没有执行权限

参考资料:

  1. [野火]i.MX Linux开发实战指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值