2010-10-08 22 views
0

Ci-dessous le code de main() de grub. Ici, je veux savoir sur cette ligne:Requête concernant main() de GRUB

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

Ici, quel fichier fopen s'ouvre? Quel fichier pointe cet argument 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;  
} 

Répondre

2

Si vous appelez votre programme avec

program arg1 arg2.txt 65

argv[1] est un pointeur vers "arg1"; argv[2] est un pointeur vers "arg2.txt", argv[3] est un pointeur vers "65", argv[4] est NULL

argv [0] soit des points à "program" ou à "" si le système d'exploitation et/ou Bibliothèque et/ou le code de démarrage ne peut pas identifier le nom utilisé pour appeler l'exécutable binaire

Dans votre cas spécifique, le programme tente d'ouvrir un fichier dont le nom est fourni dans le premier argument du programme, en mode binaire de lecture.

+0

Les noms habituels des variables sont 'argc' et' argv'. ** Il n'y a rien de mal à leur donner d'autres noms **, ça le rend juste inhabituel * et inhabituel n'est pas bon * – pmg

+0

Merci, j'ai compris. – narayanpatra

1

arg_v est un pointeur sur un tableau de pointeurs vers des chaînes passées au programme lorsque principal est invoqué. arg_v[1] est donc un pointeur vers la première chaîne transmise au programme quand elle est invoquée (même si le tableau commence à 0, l'élément 0 est le nom du programme lui-même).

Edit: Donc, pour être concret, si ce qui précède est la fonction principale d'un exécutable invoqué comme grub foo bar, puis arg_v[0] des points à la chaîne « sans tête » et arg_v[1] des points à « foo ». Par conséquent, l'appel fopen va essayer d'ouvrir un fichier nommé "foo".