void main(int argc,char *argv[])
{
for (int i = 0; i < argc; i++)
{
printf("%s ", argv[i]);
}
}
当我在终端中使用命令./test 1 2 3
执行这个程序时,我得到了结果./test 1 2 3
,但当我在另一个程序中使用函数execl("/usr/src/test", "1", "2", "3", NULL)
时,我获得了结果1 2 3
,为什么?
execl()
的语法为:
int execl(const char *path, const char *arg0, ..., /*, (char *)0, */);
所以你有
path = "/usr/src/test"
arg0 = "1"
arg1 = "2"
arg3 = "3"
将argN
参数放入新进程的argv
数组中。
您必须将路径重复为arg0
才能将其放入argv[0]
中。
execl("/usr/src/test", "/usr/src/test", "1", "2", "3", NULL)
这不是自动完成的,因为argv[0]
不需要与程序路径相同,而且在某些情况下也不需要(例如,通过在argv[0]
中添加-
前缀来调用登录shell(。
查看exec((函数族的文档:
其解释如下:
execl((、execlp((和execle((函数中的const char*arg和后续省略号可以被认为是arg0、arg1、…、。。。,argn。它们一起描述了一个或多个指向空终止字符串的指针的列表,这些指针表示可用于执行程序的参数列表按照惯例,第一个参数应该指向与正在执行的文件相关联的文件名参数列表必须由一个null指针终止,并且由于这些是可变函数,因此该指针必须强制转换(char*(为null。