2017-04-26 5 views
1

Lors de la redirection bash, j'ai demandé un question et j'ai obtenu une réponse comme suit.Obtention du handle de fichier en tant qu'argument

Avec cat < file, cat lit à partir de son entrée standard; le shell ouvre le fichier et connecte le handle de fichier à cat

Maintenant, je suis curieux de savoir comment cela est possible. Je veux dire, comment un programme (implémenté par C ou C++ comme ça) obtient un handle de fichier en tant qu'argument. Je savais que seuls les caractères (par exemple char* argc[]) étaient possibles en tant qu'arguments.

+0

Il ne le fait pas via les arguments de ligne de commande. Cela change où 'stdin' obtient son entrée quand votre processus s'exécute. – paddy

+0

http://fr.cppreference.com/w/cpp/io/c –

Répondre

1

< et file sont et non arguments.

< (et de même >, >> et | sont symboles de redirection et leur comportement est incorporé directement dans bash (et d'autres coquilles, aussi).

La redirection signifie qu'au lieu de la norme entrée/sortie (clavier et moniteur) le programme lire/écrire de/vers un fichier (<, > et >>), ou - dans le cas de | - la sortie du programme de gauche est transmise en entrée au programme de droite.

(Il suppose que le programme correspondant - comme cat dans votre cas - est programmé pour lire/écriture de l'entrée/sortie standard Pour un programmeur, il est un moyen très pratique car il/elle n'a pas besoin de se préoccuper de fichiers. et leurs gestionnaires.)

1

Le caractère < signifie que le flux d'entrée est redirigé de stdin à file. Le programme n'obtient pas le handle de fichier en tant qu'argument mais le handle stdin est remplacé par handle à file fourni dans la ligne de commande. Voir la description de Redirection on Wikipedia

2

Il ne l'obtient pas vraiment comme un argument (au moins pas un argument de ligne de commande).

Lors du démarrage d'un processus (sur un système de type UNIX), trois flux standard sont ouverts: entrée standard, sortie standard et erreur standard. Si vous ne redirigez rien, l'entrée standard proviendra du clavier, et la sortie standard et l'erreur standard iront à l'écran (connecté via certains périphériques, comme dans /dev). Lorsque vous redirigez un flux standard (entrée, sortie ou erreur), le shell ouvre un handle vers ce fichier, puis effectue la manipulation nécessaire pour le définir comme flux standard spécifié pour l'enfant - par exemple, sur un système qui utilise fork, il peut utiliser dup2 pour définir son propre handle standard pour le fichier spécifié, puis fork le processus enfant, puis (dans le parent) restaurer son flux standard (ce n'est pas la seule façon possible de le gérer, un seul possibilité).