Funzioni di allocazione dinamica. UNIVERSITÀ DEGLI STUDI DEL SANNIO Benevento DING DIPARTIMENTO DI INGEGNERIA

Documenti analoghi
Università degli Studi di Cagliari Corso di Laurea Specialistica in Ingegneria Elettronica. SISTEMI OPERATIVI A.A. 2004/2005 Docente: Giorgio Giacinto

Laboratorio di Programmazione

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Operazioni su file di caratteri

SISTEMI OPERATIVI. Processi in Linux. Giorgio Giacinto Sistemi Operativi

System Call EXEC EXEC P P. fork exec(new_prog) fork. sono_il_padre = fork(); if (!sono_il_padre) {

Input/Output su File

Streams e disk files

Linguaggio C: i file

GESTIONE DEI FILE IN C. Docente: Giorgio Giacinto AA 2008/2009

Gestione dei file in C

System call per la gestione di processi

System call per la gestione di processi

ELEMENTI DI INFORMATICA. Linguaggio C

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Gestione dei file in C

SISTEMI&OPERATIVI& AA&2013&0&2014& Processi( in(linux( Giorgio&Giacinto&2013& Sistemi&Opera?vi&

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

La gestione dei file in C

Gestione dei File. Credits Prof. Campi

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. File. Marco D. Santambrogio Ver. aggiornata al 6 Marzo 2016

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. File. Marco D. Santambrogio Ver. aggiornata al 21 Maggio 2014

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. File. Marco D. Santambrogio Ver. aggiornata al 15 Maggio 2015

Lezione 11: Liste a Puntatori e Input/Output

Pag. 1. modello di esecuzione parallela

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. File. Marco D. Santambrogio Ver. aggiornata al 15 Maggio 2013

Controllo dei Processi 1

File binari e file di testo

Gestione dei file. Stefano Ferrari. Università degli Studi di Milano Programmazione. anno accademico

LABORATORIO DI SISTEMI OPERATIVI

JAVA. import java.util.*; #include <stdio.h> public static class test { int variable; private int variable; int main (int argc, char *argv[]) {

Introduzione al C. Stream e disk file

Il linguaggio C. Puntatori e dintorni

Titolo presentazione INFORMATICA. sottotitolo A.A Milano, XX mese 20XX Laboratorio n 4 Ing. Gian Enrico Conti Dott.

Suggerimenti, note utili ed errori comuni. Fondamenti di informatica T

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Capitolo 5 -- Stevens

eseguire comandi dati dall'utente, utilizzando una macchina reale, di livello inferiore,

Introduzione al C Lez. 4

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 4

I files in C. A cura del prof. Ghezzi

Il linguaggio C. Breve panoramica su stdio.h

Corso di Informatica A.A

Gestione dei files. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni Via Leopardi 132

Gestione dei file. File di testo e binari

FILE: tipo operazione Istruì. prototipo esempi lettura di un carattere fgetc Int fgetc(file *flusso) Vedi sotto

Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Introduzione al C Unità 9 File

Introduzione al C Lez. 4. Allocazione Dinamica della memoria

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

Gestione dinamica della memoria

L'Allocazione Dinamica della Memoria nel linguaggio C

Laboratorio di Algoritmi e Strutture Dati

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi

La gestione della memoria dinamica Heap

Cosa serve per cominciare?

Files in C endofile

Strutture. Array dei nomi degli esami (MAX ESAMI è il massimo numero degli esami). Array con i crediti degli esami.

I Processi nel Sistema Operativo Unix

Il processo figlio : utilizza lo stesso codice che sta eseguendo il padre ;

Sistemi Operativi Teledidattico

I Processi nel SO UNIX

La creazione di un nuovo processo in UNIX

I Processi nel SO UNIX

Laboratorio di Sistemi Operativi Marzo-Giugno 2008 Matricole congrue 0 mod 3

Introduzione. L elaborazione dei files in C. Elaborazione dei files (1) Elaborazione dei files (2) D.D. cap. 11+ pp K.P. pp.

Laboratorio di Sistemi Operativi

Input / Output. Come già detto, input e output sono realizzati in C da funzioni di stdio.h all'interno della libreria standard

programmazione distribuita Introduzione Introduzione alla programmazione distribuita

Introduzione al C. Lezione 4 Allocazione dinamica della memoria. Rossano Venturini. Pagina web del corso

LINUX: struttura generale

Corso di Informatica A.A

file fisico file logico

Lezione 7: Funzioni e gestione dei File

I File. Il file e` l'unita` logica di memorizzazione dei dati su memoria di massa.

Lezione IX Gestione dinamica della memoria

Esercitazioni di Fondamenti di Informatica - Lez. 9 4/12/2018

I files (archivi) Il C definisce in stdio.h tre file aperti automaticamente: stdin, stdout e stderr.! Sono ad accesso sequenziale diretto

Linguaggio C Gestione File

Corso di Fondamenti di Programmazione canale E-O. Introduzione. Elaborazione dei files (2)

Allocazione dinamica della memoria

Lezione 8: Stringhe ed array multidimensionali

In generale può essere utile che i due processi eseguano del codice diverso

Informazioni Utili. Strumenti Utilizzati. Creazione e gestione di un progetto. Fondamenti di Informatica L-B (L-Z) Esercitazioni

Sistemi Operativi (M. Cesati)

Laboratorio di Sistemi Operativi primavera 2009

Perchè i files? Realizzano la persistenza dei dati. Sono delle strutture di dati sequenziali. dati che sopravvivono all esecuzione del programma

FONDAMENTI DI INFORMATICA. Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI. Facoltà di Ingegneria Università degli Studi di Udine

Esercitazioni Fondamenti di Informatica

Gestione dei File C. Generalità

D Alcune funzioni della libreria standard del C

Informazioni Utili. Fondamenti di Informatica L-B (L-Z) Esercitazioni. A.A. 2005/06 Tutor: Loris Cancellieri

Settimana n.12. Obiettivi File!di!testo. Contenuti Concetto!di!file!e!funzioni! fopen/fclose Funzioni!fgets+sscanf Approfondimenti!su!printf! e!

Processi Concetti di base. Esecuzione parallela e sequenziale Il concetto di processo Gestione dei processi

Lezione 6 Struct e qsort

Esercizi. I File ed il C

Lezione 22: Input/Output e Files

Lezione IX Gestione dinamica della memoria

Un file è un astrazione di memorizzazione di dimensione potenzialmente illimitata (ma non infinita), ad accesso sequenziale.

Transcript:

UNIVERSITÀ DEGLI STUDI DEL SANNIO Benevento DING DIPARTIMENTO DI INGEGNERIA CORSO DI "PROGRAMMAZIONE I" Prof. Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Funzioni di allocazione dinamica Una delle maggiori limitazioni delle strutture dati statiche, come gli array, è la necessità di specificarne la dimensione in sede di dichiarazione A tempo di compilazione Problemi possono nascere quando non si conosce la quantità precisa dei dati da memorizzare durante l'esecuzione A run-time Una possibile soluzione a questo problema è l uso delle funzioni di allocazione dinamica della memoria Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 1 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 2 La funzione malloc Sintassi #include <malloc.h> void* malloc(unsigned size); Funzionalità allocazione di un blocco di memoria dell ampiezza specificata Valori di ritorno puntatore al blocco allocato se NULL, l allocazione è fallita Esempio: char*stringa; stringa = (char*) malloc(20*sizeof(char)); La funzione calloc Sintassi #include <malloc.h> void* calloc(unsigned num, unsigned size); Funzionalità allocazione di un blocco di numelementi, ciascuno di ampiezza size, con inizializzazione a 0 della memoria allocata Valori di ritorno puntatore al primo elemento se NULL, l allocazione è fallita Esempio: char*stringa; stringa = (char*) calloc(20, sizeof(char)); Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 3 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 4 1

La funzione realloc Sintassi #include <malloc.h> void* realloc(void* ptr, unsigned newsize); Funzionalità ridimensionamento di un blocco precedentemente allocato Valori di ritorno puntatore al primo elemento se NULL, l allocazione è fallita Esempio: char*ptr; ptr = (char*) malloc(4*sizeof(char)); ptr = (char*) realloc(ptr, 8*sizeof(char)); La funzione free Sintassi #include <malloc.h> int free(void* ptr); Funzionalità rilascia la memoria precedentemente allocata con malloc, calloc, realloc Valori di ritorno 1 operazione completata 0 errore Esempio: char*ptr; ptr = (char*) malloc(4*sizeof(char)); free(ptr); Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 5 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 6 Esempio di array dinamico Esempio di array di stringhe head char**head; Esempio di codice constintn = 300; /* legge e salva N stringhe inserite da tastiera */ voidmain( ) { char**head, buffer[n]; intn, i; printf("quante stringhe vuoi inserire? : "); scanf("%d", &n); head = (char**) malloc(sizeof(char*)*n); for(i=0 ; i < n ; i++) { printf("inserisci la stringa: "); scanf("%s", buffer); *(head+i)=(char*) malloc(sizeof(char)*(strlen(buffer)+1)); strcpy(*(head+i), buffer); printf("\n"); for(i=0; i<n ; i++) printf("%s\n", *(head+i)); Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 7 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 8 2

Lista Notazione Una lista è una struttura dati dinamiche che implementa una sequenza di elementi di un determinato tipo Una sequenza è una collezione ordinata di elementi, ovvero si può sempre individuare il primo elemento, il secondo, etc... Gli elementi sono memorizzati associando a ciascuno di essi l informazione (riferimento) che permette di individuare la locazione in cui è inserito l elemento successivo struttura dati linkata Elementi della lista sono detti nodied i riferimenti agli elementi successivi sono rappresentati come archi a b c Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 9 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 10 Operazioni Inserimento in : prima Inserimento di un elemento in, in coda o ordinato Eliminazione di un elemento Ricerca di un elemento a b c f Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 11 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 12 3

Inserimento in : dopo Inserimento in coda: prima a b c a b c f f Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 13 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 14 Inserimento in coda: dopo Inserimento ordinato: prima a b c a b d c f Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 15 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 16 4

Inserimento ordinato: dopo Eliminazione: prima c da eliminare a b d a b c Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 17 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 18 Eliminazione: dopo Esempio di lista di stringhe a c Elemento: struct stringa{ char* str; struct stringa* next; ; La : struct stringa* head; Allocazione di un nodo: struct stringa* p; p = (structstringa *) malloc(sizeof(structstringa)); Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 19 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 20 5

void insertt(char* buf) { struct stringa* p; Inserzione in p = (struct stringa*) malloc(sizeof(struct stringa)); p->str = (char*) malloc((strlen(buf)+1)*sizeof(char)); strcpy(p->str, buf); Ricerca struct stringa* search(char* buf) { struct stringa* curr = head; while(curr&& strcmp(curr->str, buf)) curr = curr->next; p->next = head; head = p; return curr; Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 21 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 22 Visita con stampa Inserzione in coda voidstampa( ) { struct stringa* curr = head; while(curr) { printf("stringa: %s\n", curr->str); curr = curr->next; printf("\n"); void insertc(char* buf) { struct stringa* p; struct stringa* curr = head; p = (struct stringa*) malloc(sizeof(struct stringa)); p->str = (char*) malloc((strlen(buf)+1)*sizeof(char)); strcpy(p->str, buf); p->next=null; if(!head) head = p; else { while((curr) && (curr->next)) curr = curr->next; curr->next = p; Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 23 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 24 6

Inserzione ordinata Eliminazione void inserto(char* buf) { struct stringa* p; struct stringa* curr; struct stringa* prev; p = (struct stringa*) malloc(sizeof(struct stringa)); p->str = (char*) malloc((strlen(buf)+1)*sizeof(char)); strcpy(p->str, buf); p->next=null; curr=head; prev=null; if(!head (strcmp(buf, curr->str) < 0) ) { p->next=head; head = p; else { while(curr && (strcmp(curr->str, buf) < 0) ) { prev=curr; curr = curr->next; p->next=curr; prev->next = p; intelimina(char *buf) { struct stringa* prev=null; struct stringa* curr = head; if(!head) return 0; if(!strcmp(curr->str, buf)) { head = curr->next; free(curr->str); free(curr); return 1; else { while(curr && strcmp(curr->str, buf)) { prev = curr; curr = curr->next; if(!curr) return 0; else { prev->next = curr->next; free(curr->str); free(curr); return 1; Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 25 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 26 File I file sono sequenze di byte su cui è possibile effettuare operazioni di lettura, scrittura e aggiornamento Sono strutture non volatili, in quanto allocati in memoria secondaria L uso dei file si realizza mediante un insieme di funzioni di libreria L accesso ai file è per default sequenziale, anche se è possibile effettuare un accesso di tipo casuale attraverso opportune funzioni File Un file è riferito nei programmi tramite un "file pointer" FILE *fp; FILE è un tipo predefinito contenuto nella libreria stdio.h All atto dell apertura del file, il file pointeracquisisce un valore e si stabilisce il collegamento con il file presente in memoria secondaria da questo momento, il puntatore al file punta ad una struttura che contiene informazioni sul file da gestire, quali l indirizzo del buffer associato, la posizione corrente nel buffer, la modalità di apertura, ecc. Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 27 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 28 7

Funzioni I/O standard per i file fopen Le funzioni basilari per controllare l I/O da file sono: fopen() fclose() getc() putc() fgets() fputs() fprintf() fscanf() fseek() ferror() fwrite() fread() La prima operazione da compiere quando si usa un file consiste nella sua apertura: FILE *fopen(char*nomefile, char*modo); la funzione restituisce un puntatore ad un oggetto di tipo FILE, la cui struttura è definita in stdio.h; NULL in caso di problemi il primo parametro rappresenta il nome del file, il secondo la modalità di apertura del file Le modalità di apertura previste sono: r per file aperto in sola lettura w per file aperto in scrittura; se il file esiste se ne perde il contenuto a per file aperto in scrittura, per l aggiunta di nuovi dati Alcuni sistemi distinguono tra file binari e testuali nel caso di uso di file binari occorre aggiungere alle modalità precedenti il suffisso b Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 29 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 30 Esempio FILE *ingresso, *uscita; ingresso = fopen( alfa, r ); /* lettura */ uscita = fopen( beta, w ); /* scrittura */ fopen() restituisce NULL, se il file non può essere aperto, o comunque in qualsiasi situazione d errore se il file alfa non esiste, si verifica una situazione d errore Se il file beta non esiste, la funzione ne crea uno nuovo, altrimenti cancella il suo contenuto ed il puntatore al buffer si riposiziona all inizio fclose La funzione duale di fopen() è int fclose(file *file); che chiude un file precedentemente aperto in caso di successo fclose() restituisce il valore 0, altrimenti restituisce il valore EOF FILE *input; input = fopen( maggio.doc, wb ); fclose(input); Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 31 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 32 8

getc e putc Sono definite in stdio.he servono per trasferire caratteri da o verso un file aperto con fopen() int getc(file *filepunt); int putc(char c, FILE *filepunt); La funzione getc() legge un carattere dal file puntato da filepunt La funzione putc() trasferisce un carattere c nel file puntato da filepunt Esempio main( ) { FILE *file; char c; file = fopen( temp, w ); while((c = getchar( ))!= EOF) putc(c, file); fclose(file); file = fopen( temp, r ); while((c = getc(file))!= EOF) putchar(c); fclose(file); Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 33 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 34 fgets e fputs Sono analoghe alla getce putc, ma operano sulle stringhe: char* fgets(char* str, int len, FILE* fp); int fputs(char*str, FILE* fp); main( ) { FILE *file; char stringa[80]; file = fopen( temp, w ); while(gets(stringa)!= NULL) fputs(stringa, file); fclose(file); file = fopen( temp, r ); while(fgets(stringa, 20, file)!= NULL) puts(stringa); Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 35 fprintf fprintf() si comporta esattamente come la printf(), utilizzando il file invece dello standard output int fprintf(file *fp, char*form, arg0,..); fprintf() restituisce il numero di caratteri memorizzati sul file FILE *file; char*nome = Marco ; file = fopen( miofile.txt, w ); fprintf(file, Il mio nome è %s, nome); Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 36 9

fscanf fscanf() si comporta come la scanf() relativamente al file int fscanf(file *fp, char*form, arg0,...); Il valore restituito da fscanf() è il numero di elementi, letti da file, che hanno soddisfatto le specifiche imposte dalla stringa formato In caso di fine file, fscanf() restituisce EOF Esempio main( ) { FILE *file; inti; file = fopen( temp, w ); for(i=0; i < 985; i+=123) fprintf(file, %d, i); fclose(file); file = fopen( temp, r ); while(fscanf(file, %d, &i)!= EOF) printf( %d\n, i); Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 37 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 38 ferror ferror() consente di controllare lo stato delle operazioni di accesso ai file int ferror(file *filepunt); In situazioni normali ferror() restituisce il valore 0 Quando un operazione di lettura ha raggiunto la fine del file, ferror() restituisce un valore diverso da 0 se una qualche operazione di I/O ha incontrato una condizione di errore fseek fseek() implementa l accesso casuale ai file, cioè la possibilità di spostarsi in una qualsiasi posizione di un file restituisce un valore diverso da 0 se lo spiazzamento comporta l uscita dal file int fseek(file *fp, int spz, int modo); Il parametro spzconsente di posizionare la successiva operazione di lettura o scrittura in base al valore di modo se modovale 0, spzindica di quanti byte ci si deve spostare dall inizio del file se modovale 2, spzindica a quanti byte dalla fine del file ci si deve posizionare se modovale 1, spzindica di quanti byte ci si deve spostare dalla posizione attuale nel file Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 39 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 40 10

Esempio fread e fwrite main( ) { FILE *file; file = fopen( esempio.dat, r ); fseek(file, 0L, 2); /* fine file */ do { putchar(getc(file)); while(!fseek(file, -2L, 1) ); /* arretra di due caratteri */ fread() e fwrite() sono pensate per gestire informazioni costituite sia da singoli byte che da gruppi di byte (carattere, intero, struttura) int fread(void*buf, int len, int cont, FILE *fp); int fwrite(void*buf, int len, int cont, FILE *fp); Entrambe le funzioni utilizzano gli stessi parametri bufè la zona di memoria dove sono contenuti i dati lenè la dimensione, in numero di byte, degli oggetti da leggere o da scrivere contè il numero degli oggetti, tutti di lunghezza len, da leggere o da scrivere fpè il valore restituito da fopen() Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 41 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 42 Esempio main( ) { int numero; FILE *file; file = fopen( esempio, rb ); fread(&numero, sizeof(int), 1, file); printf( il numero letto è %d, numero); Esempio main( ) { int numero; FILE *file; numero = 100; file = fopen( esempio, wb ); fwrite(&numero, sizeof(int), 1, file); printf( il numero scritto è %d, numero); Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 43 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 44 11

Immagine di un processo Creazione di un processo Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 45 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 46 fork() Esempio pid_t fork(void); crea un processo figlio "identico" al padre, e restituisce: al figlio: 0 al padre: PID del figlio in caso di errore: -1 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 47 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 48 12

Esempio exec() int exec(pathname, argomenti) Rappresenta una "famiglia" di funzioni execpiù una combinazione delle lettere l, e, v, p invoca un programma dall'interno di un programma sostituisce l immagine del chiamante con il file eseguibile indicato con pathnamee lo manda in esecuzione passandogli gli argomenti Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 49 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 50 Effetto della exec La famiglia exec int execl(const char *path, const char *arg0,...); int execlp(const char*file, const char *arg0,...); int execle(const char*path, const char*arg0,..., char* const envp[]); int execv(const char*path, char*const argv[]); int execvp(const char*file, char*const argv[]); int execve(const char*filename, char*const argv[], char *constenvp[]); Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 51 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 52 13

Gli argomenti della exec path specifica il pathname del file da eseguire come processo figlio Gli argomenti arg0,..., argn sono una lista di puntatori agli argomenti da passare al processo figlio argv è un array di puntatori agli argomenti envp è un array di puntatori alla configurazione dell'ambiente attuale Esempio execl Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 53 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 54 Considerazioni L'output Il padre stampa ripetutamente un messaggio (all infinito) Il figlio stampa il contenuto della directory corrente e poi muore Padre e figlio sono eseguiti concorrentemente l output sarà "interleaved" Per eseguire lsoccorre specificarne il percorso "/usr/bin/ls", altrimenti il binario non viene trovato il primo parametro deve essere il nome del programma la lista di parametri deve terminare con uno 0 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 55 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 56 14

execvp() int execv(const char*path, char*const argv[]); Gli argomenti del comando sono passati in un vettore Il vettore deve contenere: in prima posizione, il comando da eseguire in ultima posizione, un NULL esattamente il formato di argv, poiché il vettore passato diventa l argv del programma eseguito Esempio execvp Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 57 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 58 execve() int execve(const char*filename, char*const argv[], char*const envp[]); Passa variabili d ambiente della shellal processo chiamato Sospensioni pid_t wait(int*statloc); Sospende il processo chiamante, fino a che uno dei suoi figli non termina restituisce il PID del figlio terminato, o -1 se non ci sono figli assegna a statloc l'exit status del figlio pid_t waitpid(pid_t pid, int*statloc, int options); Permette di specificare di quale figlio si attende la terminazione Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 59 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 60 15

Esempio wait exit() void exit(int status); Termina il processo chiamante e rende disponibile il valore di status al processo padre, che lo otterrà tramite wait Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 61 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 62 Processi zombie e orfani Un processo terminato passa nello stato di "zombie", e viene rimosso, dopo che il padre ha ricevuto il suo stato di terminazione con una wait Un processo "orfano", cioè il cui padre è terminato, viene "adottato" dal processo init un processo ha sempre un padre init ha PID 1 Franco FRATTOLILLO Dipartimento di Ingegneria Università degli Studi del Sannio Corso di "Programmazione I" Corso di Laurea in Ingegneria Informatica / ExAT 63 16