在绝大多数程序里, argv0 都是都是没什么用的,但其实这东西其实是有用的,见下例:
#include <stdio.h>
#include <string.h>
int applet0_main(int argc, char*argv[]) {
puts("here, applet0.\n");
return 0;
}
int applet1_main(int argc, char*argv[]) {
puts("here, applet1.\n");
return 0;
}
int main(int argc, char*argv[]) {
if(!strcmp(argv[0], "applet0")) return applet0_main(argc, argv);
if(!strcmp(argv[0], "applet1")) return applet1_main(argc, argv);
puts("unknow applet!\n");
return 0;
}
gcc app.c -o app
ln -s app allpet0
ln -s app allpet1
PATH=$(pwd) applet0
PATH=$(pwd) applet1
这时候,由于 Shell 是从一个符号链接执行的 app ,所以 argv[0] 的值就变成了符号链接的名字。
其实 BusyBox 就是这样实现基础的 Shell 指令的,当输入 echo 、 ls 这些指令时它们其实都是 /bin 下面的一个指向 /bin/busybox 的符号链接。