execv函数分析应用


函数格式:

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

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

不带 l 的exec函数:execv,execvp表示命令所需的参数以char *arg[]形式给出且arg最后一个元素必须;

//========================================================================

注意:这两个函数之间的关系,如同 execl() 与 execlp() 函数之间的关系;

就是指定程序的路径,是需要指定绝对路径,还是到系统的环境变量目录下查找;

//========================================================================

例如:

char* arg[] = {"ls", "-a", "/home", NULL};        //定义参数列表

execv("/bin/ls", arg);    // OK,第一个参数是 path,是程序所在的绝对路径;

execv("ls", arg);    // ERR, 第一个参数是程序名,不是绝对路径;

execvp("ls", arg);    // OK, 第一个参数是程序名,函数会到系统的环境变量目录下,找到该程序来执行;

//========================================================================

测试例子如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <limits.h>

int main(void)
{
    pid_t childpid;
    char* const envp[] = {"name=wkf", "addr=sz", NULL};
    
    childpid = fork();

    if(-1 == childpid)
    {
        perror("fork err! \n");
        return 1;
    }
    else if(0 == childpid)
    {
        printf("in child process!\n");
        char * const envp[] = {"AA=11", "BB=22", NULL};
        //execl("/bin/ls", "ls", "-l", NULL);
        //execl("/bin/ls", "ls", NULL);
        //execl("/bin/", "ls", NULL);
        //execlp("ls", "ls", "-a", "/home/", NULL);

        //execle("./hello", "hello", NULL, envp);
        char* arg[] = {"ls", "-a", "/home", NULL};
        //execv("/bin/ls", arg);
        //execv("ls", arg);
        execvp("ls", arg);

        printf("child process end ...!");
        return 1;
    }    

    printf("in father process! \n");
    pid_t ret = wait(NULL);
    if(ret != childpid)
    {
        perror("father wait err!");
    }
    
    printf("hehe ...\n");
    return 1;
}


//========================================================================

只需要99元就可以投资自己,掌握Linux系统编程!主要传授《Linux C/C++程序设计》《Linux 系统编程》,主页有学习视频!
只需要99元就拥有全部课程和资料,让我们用技术改变自己,改变生活,改变世界!
视频可以百度搜索:韦凯峰Linux编程学堂

### exec 函数族概述 exec 函数族用于根据指定的文件名找到可执行文件,并用该文件替换当前进程映像,从而在调用进程内部启动新的程序运行[^1]。 ### 主要函数成员及其区别 exec 家族有多个变体,主要包括: - `execl` 和 `execle`: 参数列表形式传递命令行参数 - `execv` 和 `execve`: 使用字符串数组作为参数表 - `execlp` 和 `execvp`: 自动查找环境变量 PATH 中定义的位置来定位目标程序 不同之处在于传参方式以及是否自动解析路径。带有 'p' 的版本会尝试通过 $PATH 查找二进制文件位置;而带 'e' 版本允许显式设置新进程中使用的环境变量[^3]。 ### 实际应用案例分析 下面是一个简单的 C 语言例子展示如何利用 `execvp()` 来执行 Linux 命令 `ls -l`: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(void) { printf("entering main process---\n"); // 构建 argv 数组并调用 ls 命令显示目录详情 char *argv[] = {"ls", "-l", NULL}; int ret = execvp("ls", argv); if (ret == -1) perror("execvp error"); // 如果成功则不会到达这里,因为 exec 成功后原进程被替代 printf("exiting main process ----\n"); return 0; } ``` 此代码片段展示了当 `execvp()` 调用失败时才会继续执行后续语句的特点。正常情况下,一旦 `exec*` 系列中的任意一个函数调用成功,则原有进程会被完全替换成所加载的新程序实例[^2]。 ### 关键特性说明 对于含有向量(vector)或数组形式输入参数的情况,应当构建相应的字符指针数组,并将其起始地址提供给对应的 exec 函数变种。这适用于所有以 v 结尾的形式,如 `execv`, `execve`, 或者 `execvp`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值