区分linux c exec函数族

目录

execvp vs. execv

这两个函数的主要区别在于它们如何处理程序的路径。

execv

execv 函数需要你提供要执行的程序的完整路径,并且使用一个参数数组来传递参数。它的原型如下:

c 复制代码
int execv(const char *path, char *const argv[]);
  • path:要执行的程序的完整路径。
  • argv:一个以 NULL 结尾的字符串数组,包含了程序的所有参数。

execv 函数在调用时,会替换当前进程的映像为新程序的映像,当前进程的地址空间、打开的文件描述符和当前工作目录等都会被新程序继承。

execvp

execvp 函数则不需要你提供程序的完整路径,它会自动在环境变量 PATH 指定的路径中搜索程序。它的原型如下:

c 复制代码
int execvp(const char *file, char *const argv[]);
  • file:要执行的程序的名称。
  • argv:一个以 NULL 结尾的字符串数组,包含了程序的所有参数。

execvp 函数在调用时,会使用环境变量 PATH 来查找程序文件的路径,如果找到,它会执行该程序,否则会返回错误。

区别总结

  • 路径处理execv 需要完整的路径,而 execvp 只需要程序的名称,它会在 PATH 环境变量指定的路径中搜索程序。
  • 使用场景 :如果你已经知道程序的完整路径,或者你想要确保执行的是特定路径下的程序,使用 execv。如果你想要让系统自动在 PATH 中搜索程序,使用 execvp
  • 安全性execv 通常被认为更安全,因为它不允许程序名被篡改,而 execvp 可能会因为 PATH 环境变量的设置不当而导致执行错误的程序。

在执行子程序时,如下图情况,可以混用。

execl vs. execv

这两个函数的主要区别在于它们如何处理命令行参数。

execl

execl 函数用于执行另一个程序,并且需要你明确地列出所有参数。它的原型如下:

c 复制代码
int execl(const char *path, const char *arg0, ... /* , (char *)0 */);
  • path:要执行的程序的完整路径。
  • arg0:程序的第一个参数,通常是程序的名称。
  • ...:后续的参数,每个参数后面都应该跟着下一个参数,直到最后一个参数,最后一个参数必须是 (char *)0 来表示参数列表的结束。

execl 函数的优点是简单直观,你可以直接列出所有参数。但是,缺点是你必须知道所有参数,并且参数的数量是有限的,因为 execl 函数的变长参数列表在编译时需要确定。

execv

execv 函数同样用于执行另一个程序,但它使用一个数组来传递参数。它的原型如下:

c 复制代码
int execv(const char *path, char *const argv[]);
  • path:要执行的程序的完整路径。
  • argv:一个以 NULL 结尾的字符串数组,包含了程序的所有参数。

execv 函数的优点是灵活,你可以在运行时构建参数列表,并且可以处理任意数量的参数。缺点是你需要手动构建参数数组,并且需要确保数组以 NULL 结尾。

区别总结

  • 参数传递方式execl 使用变长参数列表,而 execv 使用数组。
  • 参数数量限制execl 的参数数量在编译时确定,而 execv 可以处理任意数量的参数。
  • 灵活性execv 更加灵活,可以在运行时构建参数列表,而 execl 需要在编译时确定所有参数。
  • 使用场景 :如果你的程序需要在运行时动态构建参数列表,或者参数数量不确定,使用 execv 更加合适。如果参数数量固定,且在编译时已知,execl 是一个简单直观的选择。
相关推荐
亚空间仓鼠23 分钟前
OpenEuler系统常用服务(五)
linux·运维·服务器·网络
minji...1 小时前
Linux 线程同步与互斥(二) 线程同步,条件变量,pthread_cond_init/wait/signal/broadcast
linux·运维·开发语言·jvm·数据结构·c++
虚伪的空想家1 小时前
k8s集群configmap和secrets备份脚本
linux·容器·kubernetes
the sun342 小时前
从 QEMU 直接启动到 U-Boot 引导:嵌入式 Linux 启动流程的本质差异
linux·运维·服务器
番茄灭世神2 小时前
MCU开发常见软件BUG总结(持续更新)
c语言·stm32·单片机·嵌入式·gd32
草莓熊Lotso2 小时前
【Linux 线程进阶】进程 vs 线程资源划分 + 线程控制全详解
java·linux·运维·服务器·数据库·c++·mysql
ShineWinsu2 小时前
对于Linux:文件操作以及文件IO的解析
linux·c++·面试·笔试·io·shell·文件操作
-SGlow-2 小时前
Linux相关概念和易错知识点(52)(基于System V的信号量和消息队列)
linux·运维·服务器
江畔何人初2 小时前
TCP的三次握手与四次挥手
linux·服务器·网络·网络协议·tcp/ip
Trouvaille ~2 小时前
【MySQL篇】数据库操作:从创建到管理
linux·数据库·mysql·oracle·xshell·ddl