2012-12-16 5 views
3

J'ai donc ce programme Java qui crée des processus qui exécutent un certain programme C sur le terminal (unix), et je dois notifier le programme Java quand quelque chose arrive dans le programme C (avant la fin). Comment puis-je faire ceci? Je sais que je vais avoir besoin de signaux, mais je n'ai pas beaucoup d'expérience sur le sujet.Envoyer le signal de C vers Java

Merci d'avance!

EDIT: Ce les changements que j'ai fait à la java, après avoir appelé le processus:

  InputStream stdout = p.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(stdout); 
      BufferedReader br = new BufferedReader(isr); 
      String line = null; 
      System.out.println("<INPUT>"); 
      while ((line = br.readLine()) != null) 
       System.out.println(line); 
      System.out.println("</INPUT>"); 
      int exitVal = p.waitFor(); 
      System.out.println("Process exitValue: " + exitVal); 

je ce que je faisais dans le C quand je veux informer le java:

char buff[20]; 
size_t nbytes; 
ssize_t bytes_written; 
int fd; 
strcpy(buf, "This is a test\n"); 
nbytes = strlen(buf); 
bytes_written = write(1, buff, nbytes); 

Mais après l'avoir exécuté, j'ai seulement:

INPUT 
/INPUT 
Process exitValue: 0 
+0

Utilisez cette http://stackoverflow.com/questions/13904318/reading- a-substring-from-a-string-value à titre d'exemple, il semble faire ce que vous voulez, essayez-le –

Répondre

1

Vous pouvez créer un socket en utilisant le programme c et l'envoyer au serveur socket java. Vous pouvez rechercher sur goole pour trouver un échantillon.

4

L'un des moyens est en train de lire votre stdout de programme C

Process p = Runtime.getRuntime().exec("c.exe"); 
    InputStream stdout = p.getInputStream(); 

maintenant programme C peut parler programme Java

+1

Question est assez vague, mais c'est probablement le chemin à parcourir. Un "gotcha" avec ceci est le vidage, qui peut être par défaut "seulement quand un très grand tampon est plein", quand le programme C n'a pas de console interactive. – hyde

+1

Bon, c'était juste un indice où chercher une réponse –

+1

Ouais, c'est juste très ennuyeux si vous ne savez pas à ce sujet. Vous testez le programme à partir de la ligne de commande et tout fonctionne, ensuite vous l'exécutez depuis l'autre programme et n'obtenez aucune sortie, puis peignez vos programmes pour un autre type de bug qui n'est pas là ... – hyde

1

manière la plus simple de communiquer entre un programme Java et un autre programme donné naissance par elle, utilise les flux FIFO qui sont configurés lorsque vous lancez un sous-processus. Ainsi, par exemple, si vous avez lancé votre sous-processus en utilisant Runtime.exec() ou en utilisant ProcessBuilder, vous avez un objet de type Process. En appelant son getInputStream() vous pouvez avoir accès au processus 'stdout'.

Dans le code natif, il suffit d'imprimer vos signaux sur stdout et ils peuvent être lus par le processus Java.

+0

Oui, j'utilise Runtime.exec() dans le fichier java. Donc, je viens d'utiliser la fonction write() dans le prog C? – danielnovais92

+0

Oui, 'write', puis' flush' devrait faire l'affaire. Du côté Java, faites 'read()' depuis le flux d'entrée. – onon15

1

Vous pouvez utiliser les signaux avec Java, mais ce n'est pas le meilleur mécanisme. Je voudrais d'abord utiliser JNI, JMS, Socket, RPC ou une autre solution. Le problème avec les signaux est que cela ne vous permet pas de transmettre beaucoup d'informations et c'est le plus facile à faire correctement ou à déboguer.

Pour plus de détails sur le traitement du signal et Java

http://www.oracle.com/technetwork/java/javase/signals-139944.html

http://www.ibm.com/developerworks/java/library/i-signalhandling/ (mort lien)

http://ringlord.com/dl/Signals-in-Java.pdf

Questions connexes