Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 10-01-2013, 17:02   #1
topix93
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?
topix93 è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2013, 17:31   #2
Vincenzo1968
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:
You can simply start an external process in Java and connect to it's pipes.

// Execute command
String command = "ls";
Process child = Runtime.getRuntime().exec(command);

// Get pipes from process
InputStream in = child.getInputStream();
OutputStream out = child.getOutputStream();
InputStream error = child.getErrorStream();
Ariedit:
un po' più sotto, l'osservazione di un altro utente:
Quote:
although i find your proposed solution quite usable, what you are describing are not named pipes. named pipes have to be addressable from the outside (in case of *nix systems through the file system).

Ultima modifica di Vincenzo1968 : 10-01-2013 alle 17:39.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2013, 18:02   #3
topix93
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
topix93 è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2013, 19:31   #4
pabloski
Senior Member
 
Iscritto dal: Jan 2008
Messaggi: 8406
named pipes o sockets, sono queste le scelte più gettonate
pabloski è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2013, 22:40   #5
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
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.
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 10-01-2013, 23:20   #6
Vincenzo1968
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();
 }
http://magdalena.thedarkmere.net/~be...Pipe.java.html

Ultima modifica di Vincenzo1968 : 10-01-2013 alle 23:23.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2013, 09:26   #7
topix93
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?
topix93 è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2013, 09:53   #8
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da topix93 Guarda i messaggi
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?
Lettura e scrittura da e su una pipe sono operazioni bloccanti. Se java prova a leggere qualcosa dalla pipe ma non c'è niente la read rimane in attesa all'infinito. Stessa cosa per le scritture. Se il programma C prova a scrivere su una pipe piena da cui nessuno legge questa rimane bloccata finché qualcuno non legge i dati che erano già stati scritti.

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.
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2013, 09:59   #9
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Ma usare ZeroMQ, tipo?
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2013, 10:09   #10
topix93
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
topix93 è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2013, 10:24   #11
Vincenzo1968
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]

Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2013, 10:24   #12
topix93
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?
topix93 è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2013, 10:32   #13
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da topix93 Guarda i messaggi
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?
http://zguide.zeromq.org/page:all
All'inizio c'è un esempio di request-reply pattern. Sostanzialmente è come aprire un socket, ma con gli steroidi. Ci sono esempi in vari linguaggi.
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2013, 14:24   #14
Vincenzo1968
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)
NetBeans IDE 7.2.1

Perché?

Ultima modifica di Vincenzo1968 : 11-01-2013 alle 14:34.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2013, 14:36   #15
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
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
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2013, 14:43   #16
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515


Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2013, 14:45   #17
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da Vincenzo1968 Guarda i messaggi


Eh dai, fossero questi i problemi veri...
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2013, 14:51   #18
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da Vincenzo1968 Guarda i messaggi


Ti sarai scordato di creare la cartella del package.
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2013, 14:55   #19
Vincenzo1968
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.

Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 11-01-2013, 15:46   #20
topix93
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;
}
JAVA
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();
		}
	}

}
topix93 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
Xbox Cloud Gaming arriva su Amazon Fire ...
Un blackout a San Francisco manda in til...
Windows 11 è diventato più...
Apple cambia strategia a causa della cri...
007 First Light: uscita rimandata di due...
Samsung Galaxy A37 e A57: il comparto fo...
DAZN lancia la sua offerta di Natale: My...
Gigabyte fa marcia indietro? Sparito il ...
Alcuni rivenditori giapponesi bloccano l...
Le feste non placano Amazon, anzi: aggio...
Roborock Q10 S5+ a un super prezzo: robo...
Formula sceglie WINDTRE BUSINESS per gar...
EXPO 1.20: AMD migliora il supporto all'...
MacBook Pro con chip M4, 24GB di RAM e 1...
Lefant M330 da 6.000Pa a 139€ o ECOVACS ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:03.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v