void main(int argc,char *argv[]){ for (int i = 0; i < argc; i++) { printf("%s ", argv[i]); }}
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,为什么?
./test 1 2 3
execl("/usr/src/test", "1", "2", "3", NULL)
1 2 3
z9gpfhce1#
execl()的语法为:
execl()
int execl(const char *path, const char *arg0, ..., /*, (char *)0, */);
所以你有
path = "/usr/src/test"arg0 = "1"arg1 = "2"arg3 = "3"
path = "/usr/src/test"
arg0 = "1"
arg1 = "2"
arg3 = "3"
argN参数被放入新进程的argv数组中。您必须将路径重复为arg0,才能将其放入argv[0]。
argN
argv
arg0
argv[0]
execl("/usr/src/test", "/usr/src/test", "1", "2", "3", NULL)
这不是自动完成的,因为argv[0]不需要与程序路径相同,而且在某些情况下不是这样(例如,通过在argv[0]中添加-前缀来调用登录外壳)。
-
3htmauhk2#
查看exec()函数系列的文档:它在那里解释如下:Execl()、execlp()和execle()函数中的const char*arg和后续省略号可以被视为arg0、arg1、...、argn。它们一起描述了一个或多个指向以空结尾的字符串的指针的列表,这些字符串表示可用于执行的程序的参数列表。**按照惯例,第一个参数应指向与正在执行的文件相关联的文件名。*参数列表必须以空指针结束,并且由于这些是可变函数,因此该指针必须强制转换(char)为空。
2条答案
按热度按时间z9gpfhce1#
execl()
的语法为:所以你有
argN
参数被放入新进程的argv
数组中。您必须将路径重复为
arg0
,才能将其放入argv[0]
。这不是自动完成的,因为
argv[0]
不需要与程序路径相同,而且在某些情况下不是这样(例如,通过在argv[0]
中添加-
前缀来调用登录外壳)。3htmauhk2#
查看exec()函数系列的文档:
它在那里解释如下:
Execl()、execlp()和execle()函数中的const char*arg和后续省略号可以被视为arg0、arg1、...、argn。它们一起描述了一个或多个指向以空结尾的字符串的指针的列表,这些字符串表示可用于执行的程序的参数列表。**按照惯例,第一个参数应指向与正在执行的文件相关联的文件名。*参数列表必须以空指针结束,并且由于这些是可变函数,因此该指针必须强制转换(char)为空。