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

Concurrence et multi-thread Java Discussion :

Communication inter-threads par stdout sous linux


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Communication inter-threads par stdout sous linux
    Bonjour à tous,

    Je développe actuellement une application linux qui me pose quelques soucis.
    En effet, j'essaye de faire communiquer une application java avec un programme en C.
    J'essaye pour celà d'utiliser stdout:voici le protocole:
    - mon appli C (appelée appliC) est lancée par on programme java (appliJava).
    - appliC envoie son pid sur stdout ("pid : XXX") avec un simple printf

    - appliJava le récupère (code après)
    - applic envoie ensuite des infos sur stdout, également récupérés par appliJava
    - le programme C est arrété par l'envoie d'un signal USRSIG2 par appliJava




    Mon problème est que cela ne marche pas et me fait planter le pc...

    Voici mon code (coté appliJava):
    Tout ceci est inclu dans la même classe ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /*Lancement du processus C*/
    		Runtime runtime=Runtime.getRuntime();
    		try {
    			process=runtime.exec(new String[]{"../record/record"});
    		} catch (IOException e1) {
    			// TODO Auto-generated catch block
    			System.err.println("Veuillez r�installer l'outil record");
     
    		}


    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
    //Création du thread de lecture de flux
     
    		Thread t = new Thread (new Runnable() {
    			public void run() {
    				/*Recuperation du pid pour destruction*/
    				BufferedReader reader = new BufferedReader(new InputStreamReader(getInputStream()));	
    				String line = "";
     
    				try {
    					while( ((line = reader.readLine()) != null)) {
    						//Traitement du flux de sortie
    						if(line.startsWith("pid ")){
    							pid=line.substring(4);
    							System.out.println("pid: "+line);
    						}else{
                                                    //autre que pid
                                                    ....
                                                    }
    					}
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		}
    		);
    		t.start(); 
    	}

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    /*Destruction du processus*/
    public void destroy() {
    		if(pid.equals("")) {System.out.println("le pid n'est pas r�cup�r�");return;}
    		try{
    			Runtime.getRuntime().exec(new String[]{"kill","-USR2",pid});
    		} catch (IOException e) {
    			System.out.println("Erreur lors du kill -USR2 "+pid);
    			e.printStackTrace();
    		}
     
    		System.out.println("Fin du Recorder");
    	}


    Mon principal soucis est que je ne recoit aucun message (pid) sur stdout de mon appli java...
    Et le programme record marche parfaitement s'il n'est pas lancé.

    Merci de m'aider

    Modéré par zekey: Suppression de Help Wanted dans le sujet. Ce n'apporte rien a la description du sujet et de plus on demande, on ne veut pas. :-)

  2. #2
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    J'avoue ne pas avoir analyser ton code, mais je trouve que le design n'est pas bon. De mon point de vue stdout et stdin ne sont pas adaptés. En effet pour faire communiquer deux processus les sockets me semblent bien mieux, indépendant du système cibles et surtout fait pour cela.
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    effectivement j'avais pensé à passer par autre chose que les tubes, mais je pensais que stdout était bien adapté.

    je ne connais pas les sockets, mais comment puis-je faire pour que les deux programmes sachent où ecrire/ecouter?

  4. #4
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Il y en a de nombreux dans la section Cours et tutoriel java:[url]http://java.developpez.com/cours/#tutoriels[/ur]

    Notemment:http://gfx.developpez.com/tutoriel/java/network/
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Ca y est, j'ai tout implémenté avec les Sockets.

    Cela marche quand je lance appliC en dehors de mon programme java et que je lance l'appliJava.

    Par contre si je fais ainsi:

    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
     
    try {
    			process=runtime.exec(new String[]{"appliC"});
    			wait(10);
    		} catch (Exception e1) {
    			// TODO Auto-generated catch block
    			System.err.println("Veuillez r�installer l'outil record");
     
    		}
     
     
     
    		Thread t=new Thread(new Runnable(){
    			public void run(){
     
    				/*Lancement du client*/
    				//Ouverture du socket
    				try {
    					while(true){
    						Socket sock=new Socket( InetAddress.getByName(null),10001);
    					BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
    					String ligne=in.readLine();
     
     
    						if(ligne!=null && ligne!=""){
    							if(ligne.startsWith("pid ")){
     
    							}else{
    								actions.add(ligne);
    								System.out.println(ligne);
    							}
    						}
    						in.readLine();
    					}
    				} catch (UnknownHostException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
     
    			}
    		});
    		t.start();
     
     
     
    	}

    Je recois une exception comme quoi la connection est refusée....
    Je ne sais pas pourquoi.

    Merci de m'eclairer si vous avez une idée.

    ++

  6. #6
    Membre averti Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Points : 323
    Points
    323
    Par défaut
    Lorsque tu crées un socket, il doit y avoir à l'autre bout un serveur qui écoute sur le port que tu as dédié. Tu dois lancer une petite appli serveur dans ton code avant de créer ton socket.
    "Et tu comprendras pourquoi mon nom est l'Eternel, quand sur toi s'abattra la colère du Tout-puissant."

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    J'imagine bien qu'il faut un serveur
    L' "appliC" est un serveur.
    Comme je l'ai dit, ca marche si je la lance à la main dans un terminal et que je lance mon programme java ensuite.
    Est-ce que le probleme pourrais venir du temps qu'il faut au systeme pour lancer ce serveur et qu'il accepte des connexions?

  8. #8
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut
    Citation Envoyé par millerf
    Est-ce que le probleme pourrais venir du temps qu'il faut au systeme pour lancer ce serveur et qu'il accepte des connexions?
    Je dirais que non.
    Ajoutes un printf dans ton appliC une fois que le serveur est lancé, et un print dans l'appliJava juste avant de créer la (ou le, je ne sais pas ) socket.
    Ainsi, tu sauras si le serveur est bien lancé.
    Wer nicht probiert, verliert !!

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    En fait c'est bon.

    Je viens d'y passer toutela matinée mais ca marche.

    Merci quand même à tous.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/06/2007, 10h41
  2. Démarrage par défaut sous linux
    Par vica6a dans le forum Mandriva / Mageia
    Réponses: 9
    Dernier message: 11/02/2007, 11h41
  3. Communication inter-threads: methode elegante?
    Par jc_isd dans le forum C++
    Réponses: 10
    Dernier message: 17/01/2007, 10h55
  4. [c#]Communication inter thread
    Par chasse dans le forum Windows Forms
    Réponses: 6
    Dernier message: 18/12/2006, 20h45
  5. communication inter-thread en c sous linux
    Par splinternabs dans le forum POSIX
    Réponses: 17
    Dernier message: 22/02/2006, 09h34

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