按照惯例,传递给程序的第一个参数是可执行文件的文件名。然而,并非必须如此。
例如,考虑下面的程序:
#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
等来调用的。
pwd
命令时,它会在下一行打印出当前工作目录,但是在 C 程序中调用/bin/pwd/
命令会在终端的第一行打印出当前工作目录。 - EsmaeelE