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

Mr *_*ght 2 c linux argv argc execl

void main(int argc,char *argv[])
{
     for (int i = 0; i < argc; i++)
     {
         printf("%s ", argv[i]);
     }
}
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*mar 5

的语法execl()是:

int execl(const char *path, const char *arg0, ..., /*, (char *)0, */);
Run Code Online (Sandbox Code Playgroud)

所以你有了

path = "/usr/src/test"
arg0 = "1"
arg1 = "2"
arg3 = "3"
Run Code Online (Sandbox Code Playgroud)

参数argN被放入argv新进程的数组中。

您必须重复该路径才能arg0将其放入argv[0].

execl("/usr/src/test", "/usr/src/test", "1", "2", "3", NULL)
Run Code Online (Sandbox Code Playgroud)

这不是自动完成的,因为argv[0]不需要与程序路径相同,并且在某些情况下也不是这样(例如,通过-在 中添加前缀来调用登录 shell argv[0])。