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

Linux Discussion :

Implémentation de la commande " ls -l | wc -l " en language C


Sujet :

Linux

  1. #1
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut Implémentation de la commande " ls -l | wc -l " en language C
    Bonjour,

    Je souhaite (comme indiqué dans le titre) implémenter la commande "ls -l | wc -l" en C.
    Mon problème est que je ne trouve pas de solution comment donner le contenu de ls à wc.

    Voici ce que j'ai déjà fait:
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    int main(int argc,char **argv)
    {
     	pid_t pid;
    	int tube[2];
    	char buffer[3000];
    	pipe(tube);
    	pid=fork();
    	switch(pid)
    	{
    		case -1:	perror("fork");exit(1);
    		case 0:	close(1);
    					dup(tube[1]);
    					close(tube[1]);
    					close(tube[0]);
    					execl("/bin/ls","ls","-l",NULL);
    					exit(0);
    		default:	close(0);
    					dup(tube[0]);
    					close(tube[1]);
    					close(tube[0]);
    					/* Mon problème se situe ici, comment donner la pipe à wc
    					*/
    					execl("/bin/wc","wc","-l","-",NULL);
    	}
    	return 0;
    }
    J'ai ajouté -, car dans la man, il est expliqué ceci:

    Print newline, word, and byte counts for each FILE, and a total line if more than one FILE is specified. With no FILE, or when
    FILE is -, read standard input.

    J'ai cherché sur le forum et tuto, mais je ne trouve pas la solution.
    Quelqu'un peut-il me donner un coup de main stp ?

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    lis cela... c'est un des exemples
    http://www.ensta.fr/~gueydan/Poly/Html/
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    as-tu vu le recouvrement ?

    j'irais meme plus loin que gorgonite héhé http://www.ensta.fr/~gueydan/Poly/Html/node14.html
    le strtok est à bannir !!!

  4. #4
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Mais les liens des exemples ne sont pas actifs sur ce site.
    J' étais déjà aller voir, car tu me l'avais indiqué la semaine dernière.

    Ma redirection me semble correcte, car si je faisceci dans le père:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    read(0,buffer,sizeof(buffer));
    printf("%s\n",buffer);
    Il m' affiche bien le résultat de la commande " ls -l "

    Au début, je pensais que je n'avais besoin d 'ajouter le tiret, mais cela ne marche pas non plus.

  5. #5
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    de mémoire quand tu fais une exec function les instruction qui suivent celle ci ne sont pas executer on dit que tu a recouvert ton executable par un autre ( enfin celui du exec )

  6. #6
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    mais c'est plus du C que du linux !!!

  7. #7
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Oui, j'ai vu le recouvrement, mais peut-être que je ne l'ai pas bien saisi.

    les primitives exec recouvrent le processus courant par l' exécutable donné en argument à exec.

    Les instructions suivantes ne seront traités après cet appel. ( il n'y en a pas après, donc ce n'est pas le problème )

    Faut-il que j'ajoute un wait ?

  8. #8
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut


    Mon programme marche à merveille, pas d'erreur de conception.

    Le seul problème était que la commande wc ne se trouve pas dans " /bin " ,
    mais dans " /usr/bin "

    Vraiment de tps en tps, je galère sur des trucs pas possible.

    Merci à vous deux

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

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