继续分析lvm2_main:
第1行的函数_close_stray_fds(),没看懂,不过貌似和主干数据流没有多大的影响,暂且不管。希望以后多回头几次能读懂。咔咔。接下来的last_path_component(argv[0])是将输入的命令进行一些处理,最后得到命令名,下面的两个if是判断做一些相关处理。就pvcreate /dev/sda0而言,两个if都没有执行。
继续往下:
此处调用init_lvm(is_static),is_static==0
此处的_cmdline是一个静态变量
而这个_the_arg[0]的赋值也着实让我见识到啥是c语言高级编程,把我最后一点自信给毁了。
在代码中,我始终没找到ARG_COUNT这个变量的定义,可能是se的问题吧。
- _close_stray_fds();
- base = last_path_component(argv[0]);
- while (*base == '/')
- base++;
- if (strcmp(base, "lvm") && strcmp(base, "lvm.static") &&
- strcmp(base, "initrd-lvm"))
- alias = 1;
- if (is_static && strcmp(base, "lvm.static") &&
- path_exists(LVM_SHARED_PATH) &&
- !getenv("LVM_DID_EXEC")) {
- setenv("LVM_DID_EXEC", base, 1);
- execvp(LVM_SHARED_PATH, argv);
- unsetenv("LVM_DID_EXEC");
- }
继续往下:
- if (!(cmd = init_lvm(is_static)))
- return -1;
- struct cmd_context *init_lvm(unsigned is_static)
- {
- struct cmd_context *cmd;
- _cmdline.the_args = &_the_args[0];
- if (!(cmd = create_toolcontext(_cmdline.the_args, is_static, 0)))
- return_NULL;
- _init_rand();
- _apply_settings(cmd);
- return cmd;
- }
- static struct cmdline_context _cmdline;
- /*
- * Table of valid switches
- */
- static struct arg _the_args[ARG_COUNT + 1] = {
- #define arg(a, b, c, d, e) {b, "", "--" c, d, e, 0, NULL, 0, 0, INT64_C(0), UINT64_C(0), SIGN_NONE, PERCENT_NONE, NULL},
- #include "args.h"
- #undef arg
- };