当前位置: 技术问答>linux和unix
关于一个参数解析的问题
来源: 互联网 发布时间:2016-05-21
本文导语: 在insmod.c中看到如下代码: /* For common 3264 code, only compile main in the 64 bit version. */ #if defined(COMMON_3264) && defined(ONLY_32) /* Use the main in the 64 bit version */ #else /* This ma...
在insmod.c中看到如下代码:
该段代码好像是根据对使用的命令名进行字符串匹配,然后调用相应的函数,也就是把lsmod,rmmod等整合到了一起。。。但是如果这样理解的话lsmod,rmmod命令应该指向的是用一个文件,但是我查了下似乎不是这样。。。奇怪???
/* For common 3264 code, only compile main in the 64 bit version. */
#if defined(COMMON_3264) && defined(ONLY_32)
/* Use the main in the 64 bit version */
#else
/* This mainline looks at the name it was invoked under, checks that the name
* contains exactly one of the possible combined targets and invokes the
* corresponding handler for that function.
*/
1952 int main(int argc, char **argv)
1953 {
1954 /* List of possible program names and the corresponding mainline routines */
1955 static struct { char *name; int (*handler)(int, char **); } mains[] =
1956 {
1957 { "insmod", &insmod_main },
1958 #ifdef COMBINE_modprobe
1959 { "modprobe", &modprobe_main },
1960 #endif
1961 #ifdef COMBINE_rmmod
1962 { "rmmod", &rmmod_main },
1963 #endif
1964 #ifdef COMBINE_ksyms
1965 { "ksyms", &ksyms_main },
1966 #endif
1967 #ifdef COMBINE_lsmod
1968 { "lsmod", &lsmod_main },
1969 #endif
1970 #ifdef COMBINE_kallsyms
1971 { "kallsyms", &kallsyms_main },
1972 #endif
1973 };
1974 #define MAINS_NO (sizeof(mains)/sizeof(mains[0]))
1975 static int mains_match;
static int mains_which;
1976
1977
1978 char *p = strrchr(argv[0], '/');
1979 char error_id1[2048] = "The "; /* Way oversized */
1980 char error_id2[2048] = ""; /* Way oversized */
1981 int i;
1982
1983 p = p ? p + 1 : argv[0];
1984
1985 for (i = 0; i 1) {
2015 error("%s has an ambiguous name, it must contain %s%s.",
2016 error_id1, MAINS_NO == 1 ? "" : "exactly one of ", error_id2);
2017 return(1);
2018 }
2019 else
2020 return((mains[mains_which].handler)(argc, argv));
2021 }
2022 #endif /* defined(COMMON_3264) && defined(ONLY_32) */
该段代码好像是根据对使用的命令名进行字符串匹配,然后调用相应的函数,也就是把lsmod,rmmod等整合到了一起。。。但是如果这样理解的话lsmod,rmmod命令应该指向的是用一个文件,但是我查了下似乎不是这样。。。奇怪???
|
这是busybox的代码,你应该注意到busybox编译出来的东西,它是使用链接的方式
比如lsmod,它不是一个可执行程序,而是一个指向busybox的链接,当你执行lsmod的时候程序内的argv[0]将是lsmod,而不是busybox
比如lsmod,它不是一个可执行程序,而是一个指向busybox的链接,当你执行lsmod的时候程序内的argv[0]将是lsmod,而不是busybox
|
链接是Linux下很常用的用法,不要感到奇怪。其实busybox所有命令都是一个可执行文件完成的。你敲的命令都是月个软链接。