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

0kjbasz6  于 2022-10-23  发布在  Linux
关注(0)|答案(2)|浏览(156)
  1. void main(int argc,char *argv[])
  2. {
  3. for (int i = 0; i < argc; i++)
  4. {
  5. printf("%s ", argv[i]);
  6. }
  7. }

当我在终端中使用命令./test 1 2 3执行该程序时,我得到的结果是./test 1 2 3,但当我在另一个程序中使用函数execl("/usr/src/test", "1", "2", "3", NULL)时,我得到的结果是1 2 3,为什么?

z9gpfhce

z9gpfhce1#

execl()的语法为:

  1. int execl(const char *path, const char *arg0, ..., /*, (char *)0, */);

所以你有

  1. path = "/usr/src/test"
  2. arg0 = "1"
  3. arg1 = "2"
  4. arg3 = "3"

argN参数被放入新进程的argv数组中。
您必须将路径重复为arg0,才能将其放入argv[0]

  1. 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)为空。

相关问题