|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Dec 2009
Messaggi: 98
|
IPC tra processo C e processo JAVA
Quello che ho bisogno di realizzare è un canale di comunicazione tra un processo scritto in c ed un processo scritto in java. Sto cercando il metodo piu performante per ottenere ciò e mi sono imbattuto in questo articolo: http://homes.cs.ru.ac.za/csgw/Resear...sPDPTA2009.pdf che mostra al fondo un grafico "prestazionale" dei vari metodi per la comunicazione tra processi. Il piu veloce pare che sia il metodo delle Named Pipes (detto anche FIFO).
Con questo metodo volevo fare in modo che: - Il processo C crea la named pipe; - Il processo JAVA si mette in ascolto/lettura; - Il processo C scrive dei dati sulla named pipe; - il processo JAVA legge i dati; - il processo C riscrive altri dati... ed il processo si ripete E possibile fare una cosa di questo tipo? |
![]() |
![]() |
![]() |
#2 | ||
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Non conosco bene Java ma se con tale linguaggio puoi utilizzare le named pipe si può fare benissimo.
Attendiamo qualcuno che conosce bene Java(ma intanto googlo un attimino ). Edit: googlato. Sembrerebbe che si possa fare: http://stackoverflow.com/questions/4...d-c-c-programs Quote:
un po' più sotto, l'osservazione di un altro utente: Quote:
Ultima modifica di Vincenzo1968 : 10-01-2013 alle 16:39. |
||
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Dec 2009
Messaggi: 98
|
Quello che hai trovato tu non sono named pipe ma sono bensì pipe la differenza sta nel fatto che le pipe possono essere utilizzate solo se due processi hanno un "antenato" comune...
Non ho ancora avuto l'occasione di provare l'esempio che hai messo tu ma se dovesse funzionare bene potrei anche adottare quel metodo. il problema piu che altro è che su internet non si trovano molti esempi e quindi non so esattamente come si fa a implementare questa cosa. cio che voglio fare è lasciare a java la gestione dell'interfaccia grafica e affidare al c i compiti piu pesanti... per fare cio pero ho bisogno di una comunicazione bidirezionale per inviare comandi e ricevere i dati spero di essermi spiegato |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
named pipes o sockets, sono queste le scelte più gettonate
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Per quanto riguarda java non servono classi speciali. Basta che apri la pipe con un Input/OutputStream e ci puoi fare quello che vuoi. Per crearle da codice però non ti saprei aiutare. Quelle poche volte che le ho usate ho sempre fatto da terminale con mkfifo.
|
![]() |
![]() |
![]() |
#6 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Forse ho trovato qualcosa:
http://ubuntuforums.org/showthread.php?t=372505 http://v01ver-howto.blogspot.it/2010...mmunicate.html Il client in Java proposto nel link precedente: Codice:
Java: Echo client try { // Connect to the pipe RandomAccessFile pipe = new RandomAccessFile("\\\\.\\pipe\\testpipe", "rw"); String echoText = "Hello word\n"; // write to pipe pipe.write ( echoText.getBytes() ); // read response String echoResponse = pipe.readLine(); System.out.println("Response: " + echoResponse ); pipe.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } Ultima modifica di Vincenzo1968 : 10-01-2013 alle 22:23. |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Dec 2009
Messaggi: 98
|
Sono riuscito a fare comunicare i due processi attraverso le named pipe... ma ora mi viene un dubbio...
Se il processo C scrive una linea e il processo JAVA la legge, e diciamo che questo processo continua all'infinito, è possibile che i due processi si disincronizzino? Un'altra cosa, dato che questo processo dovra ciclare all'infinito ci può essere qualche problema? Dato che le named pipe sono come dei file è possibile che dopo un po raggiungano una dimensione molto alta? |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
Per quanto riguarda la dimensione massima che possono raggiungere mi pare di ricordare qualcosa come 4k. Ma prendilo con le pinze. Ti conviene cercare nella documentazione del tuo sistema per sicurezza. |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Ma usare ZeroMQ, tipo?
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Dec 2009
Messaggi: 98
|
ho provato a fare un ciclo dove il programma in c continua a scrivere e il programma java continua a leggere... dopo un po si nota che il C ha scritto sulla pipe piu linee di quante ne abbi lette java
Questa è l'immagine del test che ho fatto: ![]() Di sopra c'è il programma in c che scrive un progressivo e di sotto il programma java che legge... si nota che si sono sfasati di circa 100 messaggi... comunque i 4 kb si riferiscono al dimensione del testo massima prima del carattere di fine linea |
![]() |
![]() |
![]() |
#11 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
[OT]
Sembra la vecchia freddura sui carabinieri che vanno sempre in coppia perché l'uno sa scrivere e l'altro sa leggere. [/OT] ![]() |
![]() |
![]() |
![]() |
#12 |
Member
Iscritto dal: Dec 2009
Messaggi: 98
|
zeromq non l'ho avevo mai visto... ma mi interessa molto come soluzione... sapete dove posso trovare un esempio per la comunicazione tra due soli processi?
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Quote:
All'inizio c'è un esempio di request-reply pattern. Sostanzialmente è come aprire un socket, ma con gli steroidi. Ci sono esempi in vari linguaggi.
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
![]() |
![]() |
![]() |
#14 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
![]() Ho provato a compilare l'esempio del link ma quando tento di eseguire il file ClientPipeJava.class ho il seguente errore: Comando: Codice:
java ClientPipeJava Codice:
Exception in thread "main" java.lang.NoClassDefFoundError: ClientPipeJava (wrong name: clientpipejava/ClientPipeJava) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$100(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source) Codice:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package clientpipejava; import java.io.*; import java.util.*; /** * * @author VLC */ public class ClientPipeJava { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here try { // Connect to the pipe RandomAccessFile pipe = new RandomAccessFile("\\\\.\\pipe\\mynamedpipe", "rw"); String echoText = "Hello word\n"; // write to pipe pipe.write ( echoText.getBytes() ); // read response String echoResponse = pipe.readLine(); System.out.println("Response: " + echoResponse ); pipe.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } Codice:
java -version java version "1.7.0_09" Java(TM) SE Runtime Environment (build 1.7.0_09-b05) Java HotSpot(TM) Client VM (build 23.5-b02, mixed mode, sharing) Perché? ![]() Ultima modifica di Vincenzo1968 : 11-01-2013 alle 13:34. |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Te sei scordato il package. Non ho provato ma se lo lanci così va di sicuro.
Codice:
java clientpipejava.ClientPipeJava |
![]() |
![]() |
![]() |
#16 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
|
![]() |
![]() |
![]() |
#19 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Che cartella? Dove la debbo creare? Non ci pensa NetBeans automaticamente?
Comunque ho tolto il package Codice:
//package clientpipejava; e funziona quasi tutto. cioè il programma si avvia senza errori ma il server mi stampa "?????" al posto della stringa "Hello word". Il server, in C, funziona correttamente con un client in C. ![]() |
![]() |
![]() |
![]() |
#20 |
Member
Iscritto dal: Dec 2009
Messaggi: 98
|
Guarda ti metto i miei 2 codici C e JAVA che ho utilizzato:
C: Codice:
#include <stdio.h> #include <conio.h> #include <windows.h> int main(int argc, const char **argv) { printf("Creating an instance of a named pipe..."); // Create a pipe to send data HANDLE pipe = CreateNamedPipe( "\\\\.\\pipe\\temp", // name of the pipe PIPE_ACCESS_DUPLEX | WRITE_DAC, // 1-way pipe -- send only PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, // send data as a byte stream 1, // only allow 1 instance of this pipe 4096, // OutBufferSize 4096, // InBuffersize 2000, // TimeOut NULL // use default security attributes ); if (pipe == NULL || pipe == INVALID_HANDLE_VALUE) { printf("Failed to create outbound pipe instance."); // look up error code here using GetLastError() getch(); return -1; } printf("Waiting for a client to connect to the pipe..."); // This call blocks until a client process connects to the pipe bool result = ConnectNamedPipe(pipe, NULL); if (!result) { printf("Failed to make connection on named pipe."); // look up error code here using GetLastError() CloseHandle(pipe); // close the pipe system("pause"); return 1; } printf("Sending data to pipe...\n"); // This call blocks until a client process reads all the data char data[1024]; DWORD numBytesWritten = 0; sprintf(data, "This is test line 1 so there.\n"); result = WriteFile( pipe, // handle to our outbound pipe data, // data to send lstrlen(data), // length of data to send (bytes) &numBytesWritten, // will store actual amount of data sent NULL // not using overlapped IO ); if (result) { printf("Number of bytes sent: %d\n\n", numBytesWritten); } else { printf("Failed to send data.\n\n"); // look up error code here using GetLastError() } // look up error code here using GetLastError() // Close the pipe (automatically disconnects client too) CloseHandle(pipe); printf("Done.\n\n"); return 0; } Codice:
import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; public class Reader { /** * @param args */ public static void main(String[] args) { // Connect to the pipe RandomAccessFile pipe; try { pipe = new RandomAccessFile("\\\\.\\pipe\\temp", "r"); String echoResponse = null; //= pipe.readLine(); echoResponse = pipe.readLine(); System.out.println("Response: " + echoResponse ); pipe.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:43.