IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Comment marche la commande > lorsqu'elle est recréée ?


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Par défaut Comment marche la commande > lorsqu'elle est recréée ?
    Bonjour!

    Je cherche à savoir comment recréer la commande > en unix.

    C'est dans le cas d'une fonction commande appelée par une main qui exécute les commandes en fonction des délimiteurs "&;<>|".
    Ces délimiteurs sont différenciés par une fonction parsing qui renvoit un chiffre en fonction du délimiteur et remplit un tableau avec la commande

    Nous traitons ici le cas 4, la redirection >

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    	case 4: // >
    		close(1); // on ferme l'écran
    		int fichierSortie = open(respP[0],O_CREAT|O_RDWR|O_TRUNC,0,640);// pourquoi on ouvre le tableau?
     
    	if(pid>0){
     
    		        close(1);
    			printf("Dauphine>");
    			fflush(stdout);
     
    		} else {
    			close(1);// on ferme l'écran
    			dup(fichierSortie);
    			execvp(respP[0],respP);
    		}
    		break;
    	}
    Pourquoi doit on fermer deux fois l'écran (la sortie standard) Ca me fait une erreur sinon...

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Utilise plutôt dup2() que dup(), c'est moins hasardeux que de fermer puis réouvrir en priant pour que tous les descripteurs précédents soient pris...

    De plus, plutôt que d'utiliser des nombres magiques pour test descripteurs, tu devrais utiliser les constantes POSIX: STDIN_FILENO, STDOUT_FILENO...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 800
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par AntoineCompagnie Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	case 4: // >
    		int fichierSortie = open(respP[0],O_CREAT|O_RDWR|O_TRUNC,0,640);// pourquoi on ouvre le tableau?
    Pourquoi doit on fermer deux fois l'écran (la sortie standard) Ca me fait une erreur sinon...
    Bonjour

    J'aime bien ce genre de code. On sent de suite que tu sais ce que tu fais et pourquoi tu le fais (style je mets de tout en espérant que ça fasse un truc). Donc tu "n'ouvres pas le tableau", tu ouvres le fichier dont le nom est stocké dans la case 0 de ton tableau !!!
    Toutefois, la fonction open() ne prend que 3 paramètres or moi j'en compte 4 (resp[0], O_CREAT|O_RDWR|O_TRUNC, 0 (???) et 640). Là encore on sent que tu sais à quoi servent ces valeurs et ce qu'elles veulent dire...

    Et sinon tu dois fermer deux fois l'écran parce que tu as probablement un peu plus haut pid=fork() (super ces programmes incomplets qu'il faut deviner !!!) et que tu as donc deux processus. Donc en fait tu ne fermes pas 2 fois l'écran, c'est chaque processus qui ferme une fois son écran perso (le processus fils a hérité des descripteurs de son père dont l'écran !!!)
    Evidemment tu aurais fermé l'écran avant le fork(), tu ne l'aurais écrit l'instruction qu'une seule fois...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Des points bonus pour le 640 auquel il manque le préfixe pour préciser qu'il est exprimé en octal... et de toute façon il est passé en 4e paramètre de open() qui n'en attend que trois ou plus, le fichier est donc créé sans aucun droit pour personne.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Des points bonus pour le 640 auquel il manque le préfixe pour préciser qu'il est exprimé en octal... et de toute façon il est passé en 4e paramètre de open() qui n'en attend que trois ou plus, le fichier est donc créé sans aucun droit pour personne.
    voire même ça compile pas ^^

    en fait je pense qu'y a une virgule qui s'est glissée entre le 0 et le 640, typo malheureuse

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Je pense que ça compile, parce que pour des raisons historiques la fonction open() tend à être déclarée variadique: int open(const char *path, int oflag, ... );.

    À l'époque, quand on disait qu'un paramètre était optionnel (enfin pour être précis, il n'est pris en compte que quand O_CREAT est spécifié), on ne plaisantait pas.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Je pense que ça compile, parce que pour des raisons historiques la fonction open() tend à être déclarée variadique: int open(const char *path, int oflag, ... );.
    c'est vrai qu'il y a un wrapper libc pour open, on atterit pas directement sur le syscall je m'en souvenais plus du tout, bien vu ^^

  8. #8
    Membre confirmé
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Par défaut
    Oui, merci beaucoup, c'était bien une typo stupide!
    Merci pour votre analyse!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FF] Image coupé au survol lorsqu'elle est agrandie
    Par cilies38 dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 07/12/2008, 09h35
  2. Réponses: 2
    Dernier message: 10/05/2007, 22h19
  3. JFrame vide lorsqu'elle est appelée
    Par superpigeon dans le forum Agents de placement/Fenêtres
    Réponses: 8
    Dernier message: 27/03/2007, 18h23
  4. [VBA-E] masquer une combo lorsqu'elle est vide
    Par lio62 dans le forum Macros et VBA Excel
    Réponses: 46
    Dernier message: 04/02/2007, 21h16
  5. Remplacer une ressource du réseau lorsqu'elle est utilisée
    Par Charette dans le forum Web & réseau
    Réponses: 6
    Dernier message: 22/06/2005, 11h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo