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