yanghn2002

View My GitHub Profile

在绝大多数程序里, 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 指令的,当输入 echols 这些指令时它们其实都是 /bin 下面的一个指向 /bin/busybox 的符号链接。