为什么在argc和argv中传递参数的程序在以不同的方式执行时会得到不同的结果

0kjbasz6  于 2022-10-23  发布在  Linux
关注(0)|答案(2)|浏览(127)
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,为什么?

z9gpfhce

z9gpfhce1#

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]中添加-前缀来调用登录外壳)。

3htmauhk

3htmauhk2#

查看exec()函数系列的文档:
它在那里解释如下:
Execl()、execlp()和execle()函数中的const char*arg和后续省略号可以被视为arg0、arg1、...、argn。它们一起描述了一个或多个指向以空结尾的字符串的指针的列表,这些字符串表示可用于执行的程序的参数列表。**按照惯例,第一个参数应指向与正在执行的文件相关联的文件名。*参数列表必须以空指针结束,并且由于这些是可变函数,因此该指针必须强制转换(char)为空。

相关问题