IMC!


Contenuti


Foto

 







Curiosando...
Novita  Novità Link  Link Blog  Blog English  Español 
04 - Flussi di dati

 | 
Pagina successiva

Per flusso si intende una entità sulla quale è possibile leggere e scrivere dei dati. Esempi di flusso possono essere:
  1. Un file: è l'esempio per eccellenza: il file permette di immagazzinare dei dati, e di leggerli.
  2. Una pipe: è una entità astratta allocata dal sistema operativo, e può essere vista come una sorta di contenitore temporaneo per i dati: un processo può scrivere dei dati in una pipe, e un altro processo può leggere questi dati. Viene cioè utilizzata per scambiare dati tra i processi.
  3. standard input e standard output: indicati comunemente con STDIN e STDOUT, sono dei flussi particolari, utilizzati per ottenere l'input e l'output di un processo. Per un processo a riga di comando, tipicamente STDIN è tutto ciò che viene battuto sulla tastiera. STDOUT è tutto ciò che viene scritto sullo schermo.
In questa sezione sono presentate alcune funzioni che permettono di creare, leggere, scrivere e chiudere flussi di dati, come quelli provenienti da file o da altre entità come la pipe. Le funzioni sono contenute nelle librerie fcntl.h e unistd.h.
  1. open(char *nome_file, flag): la funzione restituisce un descrittore di file fd, un intero che identifica il flusso aperto. Il flusso fa riferimento a nome_file, che può essere un file effettivamente presente sul disco, oppure un'altra entità. flag identifica i permessi del flusso.
  2. read(int fd, void *buf, size_t count): la funzione legge count byte dal descrittore di file fd nel buffer buf.La funzione ritorna il numero di byte effettivamente letti.
  3. write(int fd, void *buf, size_t count): la funzione scrive count byte sul descrittore di file fd presi dal buffer buf.La funzione ritorna il numero di byte effettivamente scritti.
  4. close(int fd): chiude il descrittore di file fd.
  5. pipe(int vettore_pipe[2]): la funzione crea un flusso di tipo pipe. Tale flusso può essere letto e scritto utilizzando il vettore vettore_pipe[2]. In particolare, l'elemento vettore_pipe[0] serve come descrittore di file per la lettura, mentre vettore_pipe[1] serve come descrittore di file per la scrittura.


/* Il seguente programma crea due processi, padre e figlio, in comunicazione
tra loro tramite una pipe. Il padre legge dei dati da STDIN, cioè dalla
tastiera, li scrive sulla pipe, attende che il figlio li abbia ricevuti e
processati, e termina. Il figlio attende i dati dal padre.
Quando questi vengono scritti sulla pipe, li legge, li visualizza
a schermo, cioè su STDOUT, invia al padre il segnale di avvenuta ricezione
e poi termina.
*/


#include<stdio.h>
#include<fcntl.h>
#include <unistd.h>
#include<signal.h>

void fine()
{
}

char buf[21];
int fd_pipe[2], byte_letti;

void main()
{
int PID_padre, PID_figlio;

// Creazione della pipe
pipe(fd_pipe);

  if( (PID_padre=fork()) == 0)
  { // Figlio
 
  // Attesa dei dati
  wait();
 
  // Lettura delle pipe
  close(fd_pipe[1]);
  read(fd_pipe[0], buf,21);
  close(fd_pipe[0]);
  printf("\n ** Figlio: dati ricevuti dal padre: %s\n", buf);
 
  // Avvisa il padre della ricezione dei dati
  kill(getppid(), SIGUSR1);
 
  }
  else if(PID_figlio>0)
  { // Padre
 
  // Lettura dei dati dallo schermo
  printf("\nInserire il codice (max 20 caratteri):\n");
  byte_letti = read(0,&buf,21);
  printf("Caratteri inseriti: %i ", byte_letti-1);
  printf("\nCodice inserito: \n");
  write(1,buf,byte_letti-1);
  printf("\n");
 
  // Invio dei dati al figlio tramite pipe
  close(fd_pipe[0]);
  write(fd_pipe[1], buf, byte_letti-1);
  close(fd_pipe[1]);
 
  // Attende la fine del figlio
  signal(SIGUSR1, fine);
  pause();
  }
  else
  {
    printf("Errore nella creazione del figlio.");
    //exit(-1);
  }
}


 | 
Pagina successiva







Commenti

Nessun commento presente!

Scrivi un commento

Pui scrivere quì sotto un commento all'articolo che hai appena letto. Non sono abilitate smile, immagini e link. La lunghezza massima del commento è 4000 caratteri. La buona educazione è benvenuta, tutti i commenti offensivi saranno cancellati.

Your comment (lascia bianco!):
Utente (max 25 caratteri, obbligatorio)
Sito web (max 255 caratteri, facoltativo)
e-Mail (max 255 caratteri, facoltativa, non sarà pubblicata) Your opinion (lascia bianco!):
Commento (max 4000 caratteri, obbligatorio):





Valid HTML 4.01 Transitional
E-Mail - 59.2 ms

Valid HTML 4.01 Transitional