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 :

Read qui foire


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 22
    Points : 19
    Points
    19
    Par défaut Read qui foire
    Bonjour à tous,

    je vous explique un peu mon projet. Je dois récupérer le PID de Firefox pour le killer. Le prof veut que j'utilise le résultat envoyé par "ps - A | grep firefox-bin", ensuite mon programme récupère le PID dans les lignes et envoie un "kill -9 PID".

    Il veut qu'on utilise des fork et des tubes, alors donc, je fais un premier fork, le père ferme la sortie standard et duplique un tube, le résultat de "ps -A" est renvoyée dans le tube, aucun soucis là. Le fils lui fait un second fork et possède un autre tube.

    Le pere ferme l'entrée standard et duplique le premier tube ensuite la sortie standard est fermée et le deuxième tube est dupliqué à sa place. Je fais donc ensuite mon execl qui s'opère sur l'entrée et sortie standard, logiquement elle devrai renvoyer dans le tube2 le résultat de "grep entrée_standard firefox-bin".

    Dans le fils je fais la lecture du contenu du tube et en fait, le programme se coupe au read(). Pas moyen de récupérer un message d'erreur ni rien, le programme se coupe...

    Si je ne ferme pas la sortie standard, le resultat d'execl est conforme à ce que j'attend.

    Si je vire le read, le printf qui suit s'affiche bien...

    Voici mon code :

    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
    57
    58
    59
    60
    61
    62
    63
    64
    #include <stdio.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
     
    #define LECTURE 0
    #define ECRITURE 1
     
    int main(int arg, char **argv) {
     
    	int PID;
    	int PID2;
    	int taille;
    	int tube[2];
    	int tube2[2];
    	int res;
    	char buffer[512];
     
    	pipe(tube);
    	pipe(tube2);
     
    	PID = fork();
     
    	if (PID == 0) {
     
    		PID2 = fork();
     
    		if (PID2 == 0) {
     
    			read(tube2[LECTURE], buffer, 512);
    			printf ("Valeur : %s", buffer);
    			scanf ("%*c");
     
    		}
    		else {
     
    			close(LECTURE);
    			dup(tube[LECTURE]);
     
    			close(ECRITURE);
    			dup(tube2[ECRITURE]);
     
    			execl("/bin/grep", "/bin/grep", "firefox-bin", NULL);
     
     
    			wait(NULL);
    		}
     
     
     
    	}
    	else  {
     
    		close(ECRITURE);
    		dup(tube[ECRITURE]);	
     
    		execl("/bin/ps", "/bin/ps", "-A", NULL);
    		wait (NULL);
     
    	}
     
    	return 0;
     
    }
    Merci de votre aide :p

  2. #2
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    essaye de passer en mode raw juste avant ton execl.

    sinon tu peux faire un jolie fdopen et avoir ainsi recuperer un FILE* (flux) que tu peux manipuler plus proprement (setvbuf a la place de ce bousin pour le mode raw ^^)

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Le soucis, c'est qu'on est censé réaliser ce programme avec les connaissances qu'on a accumulée au cours et pas d'autre (normalement). Et nous n'avons pas abordé le mode raw. Il faut absolument utiliser execl et des tube non nommés, donc pipe().

    Et puis j'aimerais surtout savoir pourquoi ce read foire...

    Mais merci pour ta réponse

  4. #4
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    finalement je pense que mon idée de depart (et la solution du mode raw toussa) est pas bonne

    je pensais a un probleme de buffer sur stdout.
    mais en fait ... ça devrais pas poser de problemes. je regarderais ton code de plus pres plus tard.

    essaye d'abord de faire afficher ton ps -A a travers ton tube.
    histoire d'etre sur d'au moins ça

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    Salut,

    comme j'ai dis précédemment, si je ne ferme pas le tube en écriture dans le second fils, il m'affiche bien le résultat de ps -A | grep firefox-bin et j'ai déjà essayé d'afficher juste le ps -A et ça fonctionne aussi... C'est bizarre s't'affaire...

Discussions similaires

  1. Scrollbar qui foire en AS2
    Par seïna dans le forum Flash
    Réponses: 1
    Dernier message: 05/04/2009, 14h01
  2. Redirection DNS qui foire
    Par Gizmil dans le forum OVH
    Réponses: 3
    Dernier message: 19/01/2008, 18h00
  3. [Réseau] read socket dans while qui foire
    Par let_me_in dans le forum C++
    Réponses: 7
    Dernier message: 21/08/2007, 12h36
  4. Evenement dbl click qui foire
    Par louroulou dans le forum Access
    Réponses: 5
    Dernier message: 20/06/2006, 17h34
  5. poste de travail qui foire
    Par flo456 dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 03/04/2006, 16h04

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