【问题标题】:Query regarding main() of GRUB关于 GRUB 的 main() 的查询
【发布时间】:2011-04-22 20:54:42
【问题描述】:

下面是 grub 的 main() 代码。这里我想了解一下这条线:

file = fopen(arg_v[1], "rb");

fopen 在这里打开的是哪个文件?这个 arg v[1] 指向什么文件?

int main(unsigned arg_c, char *arg_v[])    
{    
    FILE *file;    

    if(arg_c < 2)    
    {    
        printf("Checks if file is Multiboot compatible\n");    
        return 1;    
    }    
    file = fopen(arg_v[1], "rb");    
    if(file == NULL)    
    {    
        printf("Can't open file '%s'\n", arg_v[1]);    
        return 2;    
    }    
    check_multiboot(arg_v[1], file);    
    fclose(file);    
    return 0;    
}

【问题讨论】:

    标签: c fopen grub


    【解决方案1】:

    arg_v 是一个指针数组,指向在调用 main 时传递给程序的字符串的指针。因此,arg_v[1] 是一个指针,指向在调用程序时传递给程序的第一个字符串(即使数组从 0 开始;第 0 个元素是程序名称本身)。

    编辑: 具体来说,如果以上是作为grub foo bar 调用的可执行文件的主要功能,那么arg_v[0] 指向字符串“grub”,arg_v[1] 指向“富”。因此fopen 调用将尝试打开一个名为“foo”的文件。

    【讨论】:

      【解决方案2】:

      如果你调用你的程序

      程序 arg1 arg2.txt 65

      argv[1] 是指向"arg1" 的指针; argv[2] 是指向 "arg2.txt" 的指针,argv[3] 是指向 "65" 的指针,argv[4] 是 NULL

      argv[0] 要么指向"program",要么指向"",如果操作系统和/或库和/或启动代码无法识别用于调用二进制可执行文件的名称

      在您的特定情况下,程序尝试以读取二进制模式打开一个文件,该文件的名称在程序的第一个参数中提供。

      【讨论】:

      • 变量的常用名称是argc 和argv。 给他们取别的名字并没有错,只是让它变得不寻常而且不寻常并不好
      猜你喜欢
      • 2014-12-28
      • 2020-05-23
      • 2012-03-05
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多