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

Java Discussion :

executer un programme externe


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 73
    Par défaut executer un programme externe
    Bonjours,
    j'essaie d'executer un programme linux. ici en l'occurence "vi" ou encore "top"
    Pour une commande assez simple comme "cat" ou "echo" pas de problème.
    Mais pour "vi" j'ai un fonctionnement assez etrange.
    j'ai ce message qui s'affiche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Vim: Warning: Output is not to a terminal
    Vim: Warning: Input is not from a terminal
    ensuite vi se lance mais la gestion du clavier et étrange j'arrive à saisir des chose mais vi ne les interprète pas. la saisie des combo comme :q! ne fonctionne pas donc je n'arrive pas à quiter mon appli.

    executer un top renvoie

    Merci de m'aider.
    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    public static void main(String[] args) throws IOException, InterruptedException {
     
    	//System.out.println((System.getProperties()+"").replace(",", ",\n"));
    	test1(args);
     
     
    }
     
    public static void test1(String[] args) throws IOException, InterruptedException{
    	//String ttyConfig = stty("-g");
    //		 set the console to be character-buffered instead of line-buffered
    	//stty("-icanon min 1");
     
        // disable character echoing
        //stty("-echo");
     
    	//System.setIn(new FileInputStream(FileDescriptor.in));
    	String[] exeCmd = new String[3];
    	exeCmd[0] = "/bin/sh";
    	exeCmd[1] = "-c";
    	String argsAll = "";
    	for (int i = 0; i < args.length; i++) {
    		//exeCmd[i+2] = args[i];
    		argsAll += args[i];
    	}
    	//argsAll.replace("\"", """)
    	exeCmd[2] = "\""+argsAll+"\"";
     
    	try {
    		final Process process = Runtime.getRuntime().exec(exeCmd);
     
     
    		final InputStream is = process.getInputStream();
    		final InputStream es = process.getErrorStream();
    		new Thread() {
    			public void run() {
    				try {
     
    					byte[] buffer = new byte[1024];
    					for (int count = 0; (count = is.read(buffer)) >= 0;) {
    						System.out.write(buffer, 0, count);
    					}
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		}.start();
    		new Thread() {
    			public void run() {
    				try {
     
    					byte[] buffer = new byte[1024];
    					for (int count = 0; (count = es.read(buffer)) >= 0;) {
    						System.err.write(buffer, 0, count);
    					}
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		}.start();
     
    		int returnCode = process.waitFor();
    		System.out.println("Return code = " + returnCode);
     
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
     
    	//stty(ttyConfig);
    	Thread.sleep(5000);
    	System.exit(0);
    }

  2. #2
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    A mon avis, le problème ne vient pas de ton code mais de vi. Le message indique que vi détecte que les flux d'entrée et de sortie ne sont pas sur un terminal (une console).

    Je pense que vi doit lire dans ces fluxs et qu'il y a une différence entre ces flux gérés depuis Java et les flux gérés par la console, peut-être un problème d'encodage.

    Il faudrait vérifier dans la code de vi si tu peux configurer quelque chose ou alors s'il y a des informations sur la façon dont vi doit être lancé.

  3. #3
    Membre éclairé Avatar de Raphael_Lemaire
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 61
    Par défaut
    Salut chtiboss,

    Ce serait pas pour un projet système par hasard ? J'ai fait un mini-shell à la fac de Lens et j'ai eu le même problème.

    Il existe des fonctions pour prendre le contrôle du terminal. Ton programme doit le faire avant de lancer vi, pour que vi puisse à son tour prendre le contrôle du terminal. Je chercherais demain si j'ai toujours le code.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 73
    Par défaut
    Je me suis re-penché sur ce problème et encore cassé les dent mais cette fois je vais poster la réponse. Ca peut servir....

    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
     
    import java.io.IOException;
    import java.io.InputStream;
     
    public class Main {
     
    	public static void main(String args[]) throws IOException {
    		Main main = new Main();
    		main.exec(args);
    		//main.vi();
    	}
     
     
    	public void exec(String args[]) {
    		String[] exeCmd = new String[3];
    		exeCmd[0] = "/bin/sh";
    		exeCmd[1] = "-c";
    		exeCmd[2] = args[0];// .replace("\"", "\\\"");
    		StringBuilder s = new StringBuilder();
    		try {
    			Process p = Runtime.getRuntime().exec(exeCmd);
    			InputStream in = p.getInputStream();
    			int c;
     
    			while ((c = in.read()) != -1) {
    				// System.out.print((char) c);
    				s.append((char) c);
    			}
    			in = p.getErrorStream();
    			while ((c = in.read()) != -1) {
    				System.out.print((char) c);
    			}
    			try {
    				p.waitFor();
    				System.out.println("SHELL EXEC " + args[0] + " : "
    						+ p.exitValue());
     
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		} catch (IOException ioe) {
    			ioe.printStackTrace();
    		}
    	}
     
     
    }

    et ensuite ce qui fait tout c'est çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java Main "vi </dev/tty > /dev/pts/0"

Discussions similaires

  1. [C#] Comment executer un programme externe ?
    Par Worldofdada dans le forum C#
    Réponses: 7
    Dernier message: 11/02/2009, 14h36
  2. [Système] execution des programmes externes
    Par jadoo dans le forum Langage
    Réponses: 2
    Dernier message: 06/11/2006, 16h55
  3. Exécuter un programme externe et détecter sa terminaison
    Par leserapheen dans le forum Pascal
    Réponses: 10
    Dernier message: 04/10/2006, 17h19
  4. [VB6]Executer un programme externe et récuperer les sorties
    Par agro dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 29/03/2006, 13h08
  5. [Système] Executer un programme externe depuis un scripte php
    Par Scorpion Rouge dans le forum Langage
    Réponses: 1
    Dernier message: 24/01/2006, 11h59

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