85 votes

Argc peut-il être nul sur un système POSIX?

Compte tenu de la définition standard du programme principal:

 int main(int argc, char *argv[]) {
   ...
}
 

Dans quelles circonstances argc peut-il être nul sur un système POSIX?

101voto

dbush Points 8590

Oui, c'est possible. Si vous appelez votre programme de la façon suivante:

execl("./myprog", NULL, (char *)NULL);

Ou alternativement:

char *args[] = { NULL };
execv("./myprog", args);

Puis dans "myprog", argc sera de 0.

La norme permet également spécifiquement pour un 0 argc comme mentionné dans la section 5.1.2.2.1 concernant le démarrage du programme dans un environnement hébergé:

1 La fonction appelée au démarrage du programme est nommé main. La mise en œuvre déclare aucun prototype de cette fonction. Il doit être défini avec un type de retour d' int et sans paramètres:

int main(void) { /* ... */ } 

ou avec deux paramètres (dénommée ci - argc et argv, bien que les noms peuvent être utilisés, qu'ils soient locaux pour la fonction dans laquelle elles sont déclarées):

int main(int argc, char *argv[]) { /* ... */ }

ou l'équivalent; ou dans certains autres de la mise en œuvre-définis.

2 Si elles sont déclarées, les paramètres de l' main fonction doit répondre aux contraintes suivantes:

  • La valeur de argc doit être positif ou nul.
  • argv[argc] doit être un pointeur null.

...

Notez également que cela signifie que si argc est 0, argv[0] est garanti pour être NULL. Comment printf traite un pointeur NULL si elle est utilisée comme argument d'une %s spécificateur n'est pas précisée dans la norme mais. De nombreuses implémentations de sortie "(null)" dans ce cas, mais je ne crois pas que c'est garanti.

26voto

Possum Points 318

Pour ajouter aux autres réponses, rien en C (POSIX ou non) n'empêche main () d'être appelé en tant que fonction dans le programme.

 int main(int argc, int argv[]) {
    if (argc == 0) printf("Hey!\n");
    else main(0,NULL);

    return 0;
}
 

22voto

Tom's Points 1957

Oui, il peut être égal à zéro, ce qui signifie qu' argv[0] == NULL.

C'est une convention qui argv[0] est le nom du programme. Vous pouvez avoir argc == 0 si vous vous lancer le binaire, comme avec execve de la famille et ne donnez aucun argument. Vous pouvez même donner une chaîne de caractères qui est loin d'être le nom du programme. C'est pourquoi l'utilisation d' argv[0] pour obtenir le nom du programme n'est pas entièrement fiable.

Généralement, la coquille où vous tapez votre ligne de commande toujours ajouter le nom du programme que le premier argument, mais encore une fois, c'est une convention. Si argv[0] == "--help" et que vous utilisez getopt pour analyser option, vous ne le détecte pas, car optind est initialisé à 1, mais vous pouvez configurer optind 0, utilisez getopt et "aide" de l'option s'affichera.

longue histoire courte : Il est parfaitement possible d'avoir argc == 0 (argv[0] n'est pas vraiment elle-même). Il arrive quand le lanceur ne donne pas d'argument à tous.

16voto

Stargateur Points 8393

Les premières propositions nécessaire que la valeur de argc passé de main() être "un ou plus". Elle était motivée par la même exigence dans les projets de le C ISO standard. En fait, l'historique des implémentations ont passé une la valeur zéro lorsque aucun argument n'est fourni à l'appelant de l'exec fonctions. Cette exigence a été supprimée à partir de l'ISO C standard et par la suite retirés de ce volume de POSIX.1-2017 ainsi. L' formulation, en particulier, l'usage de la parole, exige un strict Conforme POSIX Demande de passer au moins un argument à l'exec de la fonction, afin de garantir que argc être un, ou une plus grande lorsqu'il est appelé par une telle demande. En fait, c'est une bonne pratique, car de nombreux les applications existantes de référence argv[0] sans vérifier d'abord le la valeur de argc.

L'exigence Strictement Conforme POSIX Application indique également que la valeur passée comme premier argument un nom de fichier de la chaîne associé avec le processus en cours de démarrage. Bien que certains applications de passer un chemin plutôt qu'un nom de fichier de la chaîne dans certains circonstances, un nom de fichier de la chaîne est plus généralement utile, car les utilisation courante de argv[0] est dans l'impression de diagnostics. Dans certains cas, l' nom de fichier passé n'est pas le véritable nom du fichier; par exemple, de nombreuses implémentations de la connexion de l'utilitaire d'utiliser une convention de la préfixation de a ( '-' ) pour le nom de fichier réel, qui indique à l'interpréteur de commande invoquée que c'est un "login shell".

Aussi, notez que le test et [ utilitaires nécessitent des chaînes spécifiques pour la argv[0] argument avoir déterministe des comportements à travers tous les les implémentations.

Source


Peut argc être zéro sur un système POSIX?

Oui, mais il ne serait pas strictement conforme à POSIX.

3voto

Achal Points 11272

chaque fois que vous voulez exécuter un exécutable comme ./a.out il aura un argument qui est le program name . Mais il est possible d'exécuter un programme avec argc comme zero sous Linux, en l'exécutant à partir d'un autre programme qui appelle execv avec un empty argument list .

par exemple

 int main() {
    char *buf[] = { NULL };
    execv("./exe", buf); /* exe is binary which it run with 0 argument */
    return 0;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X