【linuxC语言】exec函数族

文章目录


前言

在Linux环境下,C语言提供了一组强大的函数族,即exec函数族,用于执行其他程序。这些函数允许程序在运行时加载并执行不同的程序,从而实现了程序之间的无缝交互和协作。本文将介绍exec函数族的基本概念、使用方法以及示例代码,帮助读者更好地理解和利用这些函数。


一、exec函数族

函数原型:

c 复制代码
#include <unistd.h>

int execl(const char *path, const char *arg0, ... /* (char *) NULL */);
int execv(const char *path, char *const argv[]);
int execle(const char *path, const char *arg0, ... /* (char *) NULL, char *const envp[] */);
int execve(const char *path, char *const argv[], char *const envp[]);
int execlp(const char *file, const char *arg0, ... /* (char *) NULL */);
int execvp(const char *file, char *const argv[]);

作用:

exec函数族用于在当前进程中加载并执行其他程序,替换当前进程的内存映像。它们允许程序在运行时加载不同的程序,实现程序之间的无缝交互和协作。

参数:

path:要执行的程序的路径或名称。

arg0, ...:要传递给新程序的参数列表,以及 NULL 作为结束标志。

argv\[\]:参数数组,包含程序名和参数,以及 NULL 作为结束标志。

envp\[\]:环境变量数组,每个元素是形如 "key=value" 的字符串,以及 NULL 作为结束标志。

file:要执行的程序的名称,用于在系统的 PATH 环境变量中搜索可执行文件。

返回值:

如果函数执行成功,则不返回,而是加载并执行了新的程序,因此不会有返回值。

如果函数执行失败,则返回 -1,并设置全局变量 errno 表示错误类型。

这六个函数族在功能上基本相同,但它们在接受参数和使用方式上有所不同:

execl() 和 execle():这两个函数接受可变数量的参数,用于传递给新程序的参数列表,最后一个参数必须是 NULL。execle() 还额外接受一个环境变量参数。

execv() 和 execve():这两个函数接受一个参数数组,用于传递给新程序的参数列表,数组的最后一个元素必须是 NULL。execve() 还额外接受一个环境变量参数。

execlp() 和 execvp():这两个函数与 execl() 和 execv() 类似,但它们会在系统的 PATH 环境变量中查找可执行文件。

因此,选择使用哪个函数取决于你的需求和偏好。如果你需要指定明确的文件路径,可以使用 execl()、execle()、execv() 或 execve();如果你希望在系统的 PATH 中查找可执行文件,可以使用 execlp() 或 execvp()。如果你需要传递环境变量,则需要使用带有 'e' 的函数,即 execle() 和 execve()。

二、示例代码

2.1 代码1

c 复制代码
#include <stdio.h>
#include <unistd.h>

int main() {
    printf("This is the original program.\n");

    // 使用 execl() 函数加载并执行 ls 命令
    execl("/bin/ls", "ls", "-l", NULL);

    // 如果 execl() 执行成功,下面的代码将不会执行
    perror("execl"); // 输出错误信息
    return -1;
}

|

2.2 代码2

c 复制代码
#include <stdio.h>
#include <unistd.h>

int main() {
    printf("This is the original program.\n");

    // 准备参数数组,包含命令名和参数
    char *args[] = {"ls", "-l", NULL};

    // 使用 execvp() 函数加载并执行 ls 命令
    execvp("ls", args);

    // 如果 execvp() 执行成功,下面的代码将不会执行
    perror("execvp"); // 输出错误信息
    return -1;
}

2.3 代码3

c 复制代码
#include <stdio.h>
#include <unistd.h>

int main() {
    printf("This is the original program.\n");

    // 准备参数数组,包含命令名和参数
    char *args[] = {"ls", "-l", NULL};

    // 准备环境变量数组
    char *env[] = {"PATH=/usr/local/bin", "LANG=en_US.UTF-8", NULL};

    // 使用 execve() 函数加载并执行 ls 命令,并传递环境变量
    execve("/bin/ls", args, env);

    // 如果 execve() 执行成功,下面的代码将不会执行
    perror("execve"); // 输出错误信息
    return -1;
}

总结

通过本文的介绍,读者应该对Linux环境下的exec函数族有了基本的了解。exec函数族提供了多种方式来执行其他程序,包括根据文件路径执行、在系统PATH环境变量中搜索执行、传递参数和环境变量等。这些函数的灵活性和强大功能使得它们在编写C语言程序时非常有用。通过学习和掌握exec函数族,读者可以更好地利用Linux系统的资源,编写出更加灵活、高效的程序。

相关推荐
叼烟扛炮1 小时前
Linux 学习笔记(五十八):IO 多路复用封神——epoll 底层原理揭秘
linux·运维·服务器·网络·笔记·学习·php
叼烟扛炮1 小时前
Linux 学习笔记(五十一):数据链路层与 ARP 协议——局域网寻址与黑客骗局
linux·网络·网络协议·php·tcpdump
Zwawa2 小时前
两根线怎么挂住一堆设备:I2C 协议原理
c语言·单片机·嵌入式
星恒随风2 小时前
Linux网络编程:彻底理解IO多路复用select!从fd_set位图、读写就绪到手写TCP多客户端字典服务器
linux·服务器·网络
陈布衣3 小时前
MySQL(1)_MySQL 5.7.21 Linux 安装笔记
linux·笔记·mysql
武子康3 小时前
h3.c 的两个权重槽,怎样把内存压力换成 SSD 等待
c语言·人工智能·agent
Oiiouui4 小时前
linux服务器部署Logto后端与对应前端的实现
linux·服务器·前端·后端
ITKEY_5 小时前
用 Emacs Dired 实现 em:退出文件管理器后,让终端自动切换目录
linux·服务器·emacs
wt95275 小时前
VMware 虚拟机磁盘扩容实战文档(Ubuntu 22.04 + LVM)
linux·后端
就像楞次定律5 小时前
【Linux 学习记之二】C++ 构建体系与底层链接机制的深度透视(2)
linux·后端