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






Fatal error: Call to undefined function sqlite_open() in /membri/giacobbe85/include/commenti.inc.php on line 324