gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:06:13 26 4
gpt4 key购买 nike

我的教授编写了一个程序,它使用 execve() 打印工作目录 (pwd),但我不明白其中的参数。

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

关于c - 为什么我们将命令名称作为路径和参数列表两次传递给 execve?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59040362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com