一、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-24https://gitee.com/yong-tao-zhang/projcet_yueqian/commit/5e694200e55ce51d743a25e5e76a7bcf130bee12