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

Shell et commandes GNU Discussion :

Redirection entrée standard avant EXEC


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2007
    Messages : 85
    Par défaut Redirection entrée standard avant EXEC
    Bonjour,


    je suis nouveau sur ce forum, je le connais depuis assez longtemps mais je ne sais pas si j'ai posté mon message au bon endroit désolé si ce n'est pas le cas.

    Voici mon problème :

    J'ai un programme prog qui lit sur le fichier standard d'entrée, numdescripteur 0,un nom (que l'utilisateur tape sur le clavier) puis il l'affiche sur l'écran donc numdescripteur 1.

    J'ai un deuxième programme qui créer un fils via fork() puis le fils doit exécuter "prog" en redirigeant son entrée vers un fichier "Donnees.txt" (par exemple) puis sa sortie vers un autre fichier "Resultat.txt" (par exemple).

    Donc plus clairement :

    Le pere créer un fils, le fils redirige les fichiers standard d'entrée et sortie du prog qui l'éxécute via execlp.

    J'ai deja fait un le programme :

    Contenu du prog.C

    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
    18
     
    #include <unistd.h>
    #include <fcntl.h>
    #include <iostream>
    int main(){
     
        char nom[40];
        int nbOcLus;    
     
        write(0,"Votre nom ?\n",13);
        nbOcLus=read(0,&nom,40);
     
        //écriture du nom qu'on a lu sur le clavier
        write(0,"Bonjour \n",10);
        write(0,&nom,nbOcLus);
     
        exit (0);
    }
    voici le code du programme qui créer le fils et qui doit rediriger les entrées / sorties du prog

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    #include <unistd.h>
    #include <fcntl.h>
    #include <iostream>
    #include <sys/wait.h>
     
    void mess(char*,int);
     
    int main(){
     
    pid_t idp;
    int nbOctLus,numDesc,numIn;
    char buffer[50];
     
    numDesc=open("donnees.txt", O_RDONLY, 0644); //ouverture fichier
    numIn=open("Resultat.txt", O_RDWR | O_CREAT | O_APPEND, 0644); //ouverture fichier résultat
     
    if(numIn==-1){
        mess("Probleme ouverture fichier Resultat \n",2);
        exit(1);
        }
     
    if(numDesc==-1){
        mess("Probleme ouverture fichier donnees \n",2);
        exit(1);
        }
     
    idp=fork(); //création du fils
     
     
    if(idp==-1) {
    	mess("Probleme fork",2);
    	exit(-1);
    	}
     
    if(idp==0){
     
            dup2(numDesc,0);
            close(numDesc);
            dup2(numIn,1);
           close(numIn);
    	execlp("prog","prog",NULL);
     
    	mess("probleme exec",2);
     
    	exit(2);
    	}
     
    wait(NULL);
     
    exit(0);
    }
     
    void mess(char *m,int numDescripteur){
        write(numDescripteur,m,strlen(m));
    }

    A l'éxécution je n'ai aucun message, je regarde le contenu de résultat.Txt : VIDE

    Contenu de donnees : lol



    voila j'espère que j'ai été assez clair pour que vous puissiez m'aider, merci d'avance


    AllyKo

  2. #2
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    Salut et bienvenue,

    Essayes avec execlp("./prog","prog",NULL); au lieu de execlp("prog","prog",NULL);

    Sinon mets des printf un peu partout pour suivre l' état des variables et les codes de retour de toutes les fonctions. Tu repèreras vite ce qui coince.

    PS: #include <iostream> est du C++ pas du C.

  3. #3
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Par défaut
    Ca semble le plus simple en effet...

    Met un printf court (genre printf("1"); dans ton if(pid=-1) et a la place de tes dup2 + close et avant et apres ton wait.

    Tu devrais pouvoir voir le souci assez facilement.

    Quand tu mets du fork, ca devient vite un peu le souk pour voir d'ou viennent les problemes, le père et le fils pouvant écrire en meme temps sur le stdout, mais pour débugguer le mieux reste malgrè tout le printf en étant bien carré et avec des printf très courts.

Discussions similaires

  1. [tcsh] Redirection entrée/sortie standards
    Par arkham55 dans le forum Shell et commandes POSIX
    Réponses: 5
    Dernier message: 27/04/2012, 09h21
  2. [tcsh] Redirection entrée standard
    Par arkham55 dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 26/04/2012, 11h57
  3. Redirection de l'entrée standard
    Par steeve93800 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 20/02/2008, 13h40
  4. Redirection entrée standard entre deux processus
    Par mverhaeghe dans le forum POSIX
    Réponses: 5
    Dernier message: 08/04/2007, 16h55
  5. Réponses: 2
    Dernier message: 21/12/2004, 15h28

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