为什么我们将命令名称作为路径和参数列表两次传递给 execve?

2023-11-27

我有一个由我的教授编写的程序,可以打印工作目录(pwd) 通过使用execve(),但我不明白这些参数。

pid_t pid = fork();

if(pid <0)
   perror(NULL);
else if(pid == 0)
{
   char*argv[] = {"pwd",NULL};
   execve("/bin/pwd",argv,NULL);
   perror(NULL);
}
else
    printf("Im the parent!");
return 0;
}

"/bin/pwd"给出将要执行的可执行文件的路径。

这意味着它将调用pwd功能,不是吗? 那为什么我需要拥有范围 pwd?

没有该参数程序无法运行?


按照约定,传递给程序的第一个参数是可执行文件的文件名。然而,这并不一定是必须的。

以以下程序为例:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int i;

    printf("number of arguments: %d\n", argc);
    printf("program name: %s\n", argv[0]);
    for (i=1; i<argc; i++) {
        printf("arg %d: %s\n", argv[i]);
    }
    return 0;
}

如果您从另一个程序运行此程序,如下所示:

char*argv[] = {"myprog", "A", "B", NULL};
execve("/home/dbush/myprog",argv,NULL);

上面将输出:

number of arguments: 3
program name: myprog
arg 1: A
arg 2: B

但你也可以这样运行

char*argv[] = {"myotherprog", "A", "B", NULL};
execve("/home/dbush/myprog",argv,NULL);

它会输出:

number of arguments: 3
program name: myotherprog
arg 1: A
arg 2: B

您可以使用以下值argv[0]作为了解如何调用您的程序并可能基于此公开不同功能的一种方式。

流行的busybox工具就是这样做的。单个可执行文件与不同的文件名链接。根据用户用于运行可执行文件的链接,它可以读取argv[0]知道它是否被称为ls, ps, pwd, etc.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们将命令名称作为路径和参数列表两次传递给 execve? 的相关文章

随机推荐