Tutorial di Programmazione Avanzata in ambiente Linux
In questo Tutorial video si esplora uno studio per combinare un programma scritto in C (che esegue la logica di un qualche algoritmo) con un programma scritto in Java che implementa separatamente una gui per gli input del programma C.
Guarda il VIDEO TUTORIAL COMPLETO
Argomenti trattati nel video tutorial:
- Programmazione concorrente in C uso delle funzioni fork() per creare figli del programma corrente
- Programmazione avantata in Ambiente Linux, uso di exec() per sovrascrivere un programma in memoria figlio di un programma C con una istanza di un programma .class che mostra una Gui per l'input utente
- Sincronizzazione tra padre e figlio mediante la funzione waitpid()
- Accesso a File in C
- Creazione di una GUI in Java mediane l'implementazione di una classe che estende JFrame
- Gestione degli eventi dei componenti di una gui mediante l'implementazione di un oggetto ActionListener e del relativo metodo actionPerformed
- Accesso a File da Java in particolare OutputStrem
Ciò si realizza tramite un esempio di programmazine concorrente in C nella quale il programma scritto in C si duplica in due programmi concorrenti, il Padre e il Figlio che condividono un file e si sincronizzano su di esso in modo opportuno.
Il pradre si mette in attesa del completamento del Figlio prima di avviare il suo algoritmo.
Il Figlio esegue una classe java e si fa sovrascrivere dall'eseguibile .class nel contesto di menoria, pur restando con il pid creato dal padre, e raccoglie l'input utente inviandolo in un file condiviso con il padre prima di uscire.
Il padre quindi riprende la sua esecuzione leggendo gli input prodotti dal Figlio e li elabora.
Codice Sorgente:
il file C compilare con gcc prog.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
/*
@author Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
Questo programma crea due processi concorrenti, il padre e un figlio.
Il padre resta in attesa che il figlio raccolga degli input dell utente ed esca, dopodichè
il padre uscito dall'attesa elabora tali input per generare un output.
Il figlio per raccogliere gli input dall'utente si sovrascrive eseguendo una GUI scritta in java
che mostra una interfaccia grafica con caselle di testo e pulsanti dinamicamente create a run time per
consentire all'utente di immettere dei valori, dopodichè salva tali valori in file condiviso con il padre.
Scopo del programma è offrire agli utenti del laboratorio di informatica uno strumento e un tutorial
per integrare GUI scritte in java in algoritmi scritti in C
*/
int main(int argc, char** argv){
pid_t pid_figlio;
pid_t pid;
int status;
FILE *in;
//creo un figlio
pid_figlio=fork();
pid=getpid();
if(pid_figlio!=0){
printf("[%d] Padre:> attendo l'output del figlio...\n",pid);
waitpid(pid_figlio, &status, WUNTRACED | WCONTINUED);
in=fopen("file.dat","r");
int a,b;
char str[100];
fscanf(in,"%d %d %s",&a,&b,&str);
printf("[%d] Padre:> output ricevuto... inizio elaborazione\n",pid);
printf("Risultato è: %d+%d=%d e la stringa è %s\n",a,b,(a+b),str);
}else{
in=fopen("input.dat","w");
fprintf(in,"10 2");
printf("[%d] Figlio:> attendo l'input dell'utente\n",pid);
//lancio la GUI JAVA con parametri per label e campi
execlp("java","java","InputForm","Inserisci un valore","Secondo input","Inserisci una stringa",0);
}
}
Il file Java. Compilare con javac InputForm.java
/**
@author Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
Classe che implementa una GUI invocabile anche da un programma C esterno
E' stata realizzata per scopi didattici e di tutorial per gli utenti del laboratorio di informatica
E' utilizzabile invocandola da un programma C per richiedere l'imput all'utente non da riga di comando
ma da una Form con campi di testo e pulsanti definibili dal file C e visualizzabili nella GUI Java.
Può essere usata dal sorgente C creando in esso un processo concorrente (figlio) e sul quale
il programma principale (padre) resta in attesa finche il figlio non ha raccolto tutto l'input
dell'utente tramite la GUI Java.
Quindi con una fork si genera un figlio che sovrascrive il proprio codice con quello della GUI
invocandola con una exec(nomeProgramma,argomenti) in particolare usare la seguente:
execlp("java","java","InputForm","Prima Etichetta Valore","Seconda etichetta","ecc ecc",0);
Il padre quindi resta in attesa mediante una wait(pid_figlio) finché il figlio non ha prodotto
l'output
Padre e Figlio condivideranno il file che questa classe InputForm produrrà alla pressione del tasto
OK
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class InputForm extends JFrame implements ActionListener{
JPanel pannelloComandi;
JButton okButton;
String output;
JTextField[] textField;
public InputForm(String[] args){
super("Input Form");
this.setSize(640,480);
pannelloComandi=new JPanel();
pannelloComandi.setLayout(new BoxLayout(pannelloComandi,BoxLayout.Y_AXIS));
textField=new JTextField[args.length];
for(int i=0;i<args.length;i++){
JPanel rigo=new JPanel();
rigo.setLayout(new BoxLayout(rigo,BoxLayout.X_AXIS));
rigo.add(new JLabel(args[i]));
textField[i]=new JTextField();
rigo.add(textField[i]);
pannelloComandi.add(rigo);
}
okButton=new JButton("OK, Invia Input e Chiudi Finestra");
okButton.addActionListener(this);
pannelloComandi.add(okButton);
this.add(pannelloComandi);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args){
InputForm f=new InputForm(args);
}
public void actionPerformed(ActionEvent e){
output="";
for(int i=0;i<textfield.length;i++){
output+=textField[i].getText()+" ";
}
try{
FileOutputStream out=new FileOutputStream("file.dat");
PrintStream s=new PrintStream(out);
s.println(output);
s.close();
out.close();
}catch(IOException ec){
ec.printStackTrace();
}
//System.out.println(output);
System.exit(1);
}
}
Comments powered by CComment