exec函数簇

一、main 函数的参数定义

在C语言中,main 函数是程序执行的入口点。main 函数可以接受参数,这些参数通常用于从命令行接收输入。main 函数的参数定义通常遵循以下形式:

int main(int argc, char *argv[])

或者等价地:

int main(int argc, char **argv)

这里,argc 和 argv 是 main 函数的两个参数,它们用于处理命令行参数:

  • argc(Argument Count):这是一个整数,表示命令行中传递给程序的参数数量。至少为1,因为第一个参数(argv[0])始终是程序的名称或路径。

  • argv(Argument Vector):这是一个指向字符指针数组的指针,也可以看作是一个字符串数组。每个字符串代表一个命令行参数。argv[0] 是程序的名称或路径,argv[1] 是第一个参数,依此类推,直到 argv[argc-1],它表示最后一个参数。数组以 NULL 指针结尾,但在实际使用中,你通常不需要访问这个 NULL 指针,因为 argc 已经告诉了你参数的数量。

例如:

二、execl

execl函数是exec函数簇中的一个,用于执行一个外部程序。execl函数的具体参数和行为如下:

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

参数说明

  • path:指定要执行的外部程序的完整路径。如果路径中包含空格或特殊字符,通常需要将整个路径用引号括起来,但这取决于具体的shell和上下文环境。然而,在execl函数的直接调用中,路径是直接作为字符串参数传递的,所以不需要考虑shell的引号规则。

  • arg:这是传递给程序的第一个参数。在C程序中,通常将程序的名称作为第一个参数传递,但这并不是必需的。第一个参数之后的参数(如果有的话)应该紧跟在arg之后,并在最后一个参数之后以(char *) NULL结尾。注意,execl函数采用可变参数列表,所以你可以传递任意数量的参数给被执行的程序,但必须以NULL结尾。

  • ...:这表示函数接受可变数量的参数,这些参数将作为命令行参数传递给要执行的程序。

  • (char *) NULL:这是参数列表的结束标记,表示没有更多的参数要传递给程序。注意,这里的NULL必须显式地作为最后一个参数传递,因为execl函数无法像某些其他exec函数那样通过参数数量来自动推断列表的结束。

返回值

  • 如果execl函数调用成功,则不会返回,因为当前进程的映像将被新程序的映像替换。
  • 如果调用失败,则返回-1,并设置全局变量errno以指示错误原因。

注意事项

  • 在使用execl函数时,需要确保提供的路径是正确的,并且程序具有执行权限。
  • 由于execl函数采用可变参数列表,因此在实际编程中,可能需要使用宏或内联函数来生成参数列表,特别是在参数数量不确定的情况下。
  • 由于execl函数要求以NULL结尾的参数列表,因此在传递参数时需要特别注意不要遗漏这个结束标记。

示例 

三、execv

execv函数是exec函数族的一个成员,用于在当前进程中执行一个指定的程序。该函数的参数具体说明如下:

函数原型

#include <unistd.h>  
int execv(const char *path, char *const argv[]);

参数说明

  • path:这是一个指向以null结尾的字符串的指针,该字符串指定了要执行的程序的路径。这个路径可以是绝对路径,也可以是相对于当前工作目录的相对路径。

  • argv:这是一个指向字符指针数组的指针,该数组包含了要传递给新程序的参数列表。数组中的第一个元素(argv[0])通常指定了新程序的名称,尽管这个名称对于新程序的实际执行并不总是必要的,但它经常用于错误消息或程序内部的日志记录。数组的最后一个元素必须是一个空指针(NULL),用于表示参数列表的结束。

返回值

  • 如果execv函数执行成功,则当前进程的映像会被新程序的映像替换,因此execv函数不会返回。
  • 如果execv函数执行失败,则返回-1,并设置全局变量errno以指示错误原因。

注意事项

  • 在使用execv函数时,需要确保提供的程序路径是正确的,并且程序具有执行权限。
  • execv函数会替换当前进程的映像,包括代码、数据、堆和栈等,因此在新程序开始执行之后,原程序的代码和数据将不再存在。
  • 由于execv函数成功时不会返回,因此通常会在调用execv之前进行一些准备工作,并在调用之后添加错误处理代码来处理可能的失败情况。

 示例

 

四、execvp

execlp 属于 exec 函数族,该族函数用于用一个新的进程映像替换当前进程的映像。execlp 函数的特别之处在于它会在 PATH 环境变量所指定的目录中查找符合参数 file 的文件名,找到后便执行该文件。

函数原型如下:

#include <unistd.h>  
int execlp(const char *file, const char *arg, ...);
  • 参数

    • file:要执行的程序的文件名(不包含路径)。execlp 会在 PATH 环境变量指定的目录列表中查找这个文件。
    • arg:传递给要执行程序的参数,第一个 arg 通常设置为程序的名称(虽然这不是必须的),之后的参数是实际要传递给程序的参数。参数列表必须以 NULL 结尾。
  • 返回值

    • 如果执行成功,execlp 不会返回,因为当前进程的映像已经被新程序替换。
    • 如果执行失败,execlp 返回 -1,并将错误码存储在全局变量 errno 中。

示例

参考代码如下:

https://gitee.com/yong-tao-zhang/projcet_yueqian/tree/master/8-24icon-default.png?t=N7T8https://gitee.com/yong-tao-zhang/projcet_yueqian/commit/5e694200e55ce51d743a25e5e76a7bcf130bee12

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天雨~流芳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值