Diffusione dei linguaggi di programmazione IEEE 2016 · programma tramite riga di comando facendo...
Transcript of Diffusione dei linguaggi di programmazione IEEE 2016 · programma tramite riga di comando facendo...
LinguaggioCeLinux
SISTEMIOPERATIVI
DiffusionedeilinguaggidiprogrammazioneIEEE2016
GiorgioGiacinto2016
2
SistemiOperativi
DiffusionedeilinguaggidiprogrammazioneIEEE2015e2014
GiorgioGiacinto2016
3
SistemiOperativi
2015 2014
Diffusionedeilinguaggidiprogrammazione
GiorgioGiacinto2016
4
SistemiOperativi
ProgrammieFunzioni» Unafunzioneèunacollezionediistruzioniche
permettonodisvolgereunadeterminata
operazioneerestituiredeivalori.
» Ogniprogrammafausodifunzioni
˃ definitenelprogrammastesso
˃ (giàscrittee)disponibiliinlibrerie.
» Perlibreriasiintendeuncontenitoredi
funzioni.
» NeisistemiUNIX,lelibreriesonotipicamente
presentiin/usr/lib e/usr/local/lib
GiorgioGiacinto2016
5
SistemiOperativi
Libreriestaticheedinamiche» Libreriestatiche
˃ lefunzionireferenziateall'internodiunprogramma
sonoestrattedallalibreria(contienecodiceioggetto)
eincorporatenell’eseguibileinfasedicompilazione
(fasedilinking)
» Libreriecondivise(odinamiche)
˃ Contengonooggettiutilizzabilidapiùprogrammi.
Ilprogrammaeseguibilecontienesoloiriferimentia
talioggetti,chevengonocaricatiinmemoria(senon
giàpresenti)infasediesecuzionedelprogramma
GiorgioGiacinto2016
6
SistemiOperativi
CompilareunprogrammaCinLinux
» PercompilareunprogrammaCinLinuxèpossibile
utilizzareilcompilatore“GNUCompiler”gcc
» Produrreuneseguibileapartiredalcodicesorgente
(compilazione+link)
gcc -o <nome_eseguibile> <sorgente>.c
» Compilareproducendocodiceoggetto
gcc -c <sorgente>.c
GiorgioGiacinto2016
SistemiOperativi
7
Creareunalibreriadifunzioni» Creareunalibreriadifunzioni
˃ Creazionecodiceoggettodellefunzioni
+ gcc -c <func>.c
˃ Creazionedellalibrerialib<nomelib>.a+ libtool -o lib<nomelib>.a <func>.o ...
– oppure...
+ ar cr lib<nomelib>.a <func>.o ...
GiorgioGiacinto2016
SistemiOperativi
8
Compilazioneconlibreriadifunzioni» Creazionedell'headerfile<nome>.h
˃ devecontenereiprototipidellefunzioni
» Compilazioneconinclusionedellalibreria
˃ gcc -o <nome_exe> <prog>.c -L<dir> -l<nomelib>
» L'opzione-l chiedealcompilatoredieffettuareillink
trailcodiceoggettoprodottodallacompilazionedi
<prog>.c eilcodiceoggettodellalibreria
lib<nomelib>.a
» L'opzione-L inserisceladirectory<dir> traipercorsi
incuiilcompilatoreandràacercare
lib<nomelib>.a
GiorgioGiacinto2016
SistemiOperativi
9
Libreriepredefinite» Assiemealcompilatorevengonoforniteuncerto
numerodilibreriedifunzionipredefinite
(es.librerieperl'input/output,libreriematematiche,
ecc.)
˃ libc èlalibreriafondamentalechevieneutilizzataper
defaultinfasedilink
˃ Contieneilcodiceoggettodifunzionifondamentaliquali
printf,scanf,open,read,y,ecc.
» Ilcomandoar consentedivisualizzareilcontenutodi
unalibreria
˃ ar t /usr/lib/libc.a | pr -4 -t˃ pr formattal'outputsu4colonne
GiorgioGiacinto2016
SistemiOperativi
10
Argomentidarigadicomando» E'possibileaccedereagliargomentipassatiadun
programmatramiterigadicomandofacendousodei
parametriargc eargv dellafunzionemain()˃ argc:unvaloreinterochespecificailnumerodi
parametriimmessinellarigadicomando
˃ argv :unarraydipuntatoriastringhedicaratteri.Ogni
elementodiargv puntaaunargomentodellarigadi
comando
˃ Es:cp file1.c file1.bak+ argc = 3+ argv[0] = cp argv[1] = file1.c argv[2] = file2.bak argv[3] = NULL
GiorgioGiacinto2016
11
SistemiOperativi
Argomentidarigadicomando:unesempio» rigacom.c
void main(int argc, char *argv[]) {int i=0;printf(�Nella riga di comando sono statiinsertiti %d argomenti:\n\n�, argc);
for (i=0; i<argc; i++)printf(�argv[%d] = %s\n�, i, argv[i]);
}» Compiliamo ed eseguiamo...
˃ gcc -o rigacom rigacom.c˃ rigacom uno due �tre quattro� cinque
» Risultato
Nella riga di comando sono stati insertiti 5 argomenti:rigacomunoduetrequattrocinque
GiorgioGiacinto2016
12
SistemiOperativi
SchemaprogrammainlinguaggioC/*** Qui un commento sul programma*/
/* header per l‘utilizzo di funzioni di libreria */#include <stdio.h>
/* prototitpo di funzione */double funct(int, int);
/* definxione funzione */double funct(int a, int b) {
/* elaborazione input e output del risultato */
return(double) a*b ;}
GiorgioGiacinto2016
13
SistemiOperativi
SchemaprogrammainlinguaggioC#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <limits.h>
int main (int argc, char **argv ) {
int error = 0;int a, b;if(argc != 3) error = 1;else {
a = strtol(argv[1], NULL, 10);if(errno == ERANGE) error = 1;b = strtol(argv[2], NULL, 10);if(errno == ERANGE) error = 1;
}if(error) {
printf(”\nUtilizzo: %s n1 n2\n""n1 e n2 sono numeri interi\n"“compresi tra %d e %d (base 10). \n\n”,argv[0], LONG_MIN, LONG_MAX);
return -1;}printf("\n=> %d x %d = %.0f\n\n”, a, b, funct(a, b));return 0;}
GiorgioGiacinto2016
14
SistemiOperativi
Allocazionedinamicadellamemoria» Funzioniperl'allocazionedellamemoria(man 3 malloc)
#include <stdlib.h>void *calloc(size_t nmemb, size_t size);
allocamemoriaperunarraydinmemb elementidi
dimensionesize.Lamemoriaallocatavieneinizializzataa0
void *malloc(size_t size);allocasize bytedimemoriasenzainizializzarla
void free(void *ptr);liberalamemoriaprecedentementeallocatapuntatadaptr
void *realloc(void *ptr, size_t size);modificaladimensionedelbloccodimemoriapuntatodaptr
» calloc(),malloc() erealloc() restituisconoun
puntatorealbloccodimemoriaallocato,oppureNULLincasodi
fallimento
» free() nonrestituiscealcunvalore
GiorgioGiacinto2016
SistemiOperativi
15
Lagestionedeglierrori» Lachiamataadunafunzionepotrebbenonandareabuon
fine.
Adesempio,l’usolafunzioneopen() peraprireunfile
inesistentecauseràunerrore
» IngenerelefunzionipredefinitedelCincasodierrore
restituiscono-1econtemporaneamenteimpostanoilvalore
diunavariabileglobalechiamataerrno
» Lavariabileglobaleerrno èunavariabileinterache
contieneilcodicedell'errorecheèstatoriscontrato
» Lafunzioneperror() stampaavideounastringache
descrive“aparole” ilcodicedierrorememorizzatoinerrno
GiorgioGiacinto2016
SistemiOperativi
16
I/Odibassolivello
» Lagestionedell'I/Oafileorientataalflussofariferimentoadunfile
tramiteunpuntatoreafileFILE*
» Lefunzioniperlagestionedell'I/Odibassolivelloutilizzanounvalore
interochiamatofilehandle odescrittoredifile.
F l u s s o B a s s o l i v e l l o D e s c r i z i o n e
fopen
fgetsfputs
fclosefseek
feof
open, creat
readwrite
closelseek
eof
Apre o crea un file
Legge dati da un fileScrive i dati su un file
Chiude un filePorta ad uno specifico offset all'interno del file
Ricerca la fine del file
GiorgioGiacinto2016
SistemiOperativi
17
I/Odibassolivello» Lefunzioniopen() ecreat() (man2open)
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>
int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);int creat(const char *pathname, mode_t mode);
˃ pathname indicailpercorsodelfiledaaprire.
˃ Ilvalorediflag indicaseilfiledeveessereapertoinlettura,scrittura,ecc.Ilvaloredimodeesprimeipermessisulfile.
˃ Incasodisuccessorestituisceuninterocherappresentailprimo(piùpiccolo)descrittoredi
filedisponibile
˃ Incasodierrorerestituisce-1 eimpostailvaloredellavariabileglobaleerrno inmododa
esprimereiltipodierroreoccorso
GiorgioGiacinto2016
SistemiOperativi
18
I/Odibassolivello
» Lefunzioniread() ewrite() (man2read;man2write)
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);ssize_t write(int fd, const void *buf, size_t count);
˃ write() scrivecount bytedibuf nelfilepuntatodafd
˃ read() leggecount bytedalfilepuntatodafd elimemorizza
inbuf
˃ Incasodierrorerestituiscono-1 eimpostanoilvaloredella
variabileglobaleerrno inmododaesprimereiltipodierrore
occorsoGiorgioGiacinto2016
SistemiOperativi
19
I/Odibassolivello:unesempio#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#defineBUFFER_LENGTH1024
/*Esegue lacopia diunfile*/
int main(int argc,char*argv[]){
int fd_orig,fd_dest;
charbuffer[BUFFER_LENGTH];
if((fd_orig =open(argv[1],O_RDONLY))
==-1){
perror("opendelfileorigine");
exit(2);
}
if((fd_dest =open(argv[2],O_RDWR|O_CREAT|
O_TRUNC,S_IRUSR|S_IWUSR|S_IRGRP|
S_IWGRP))==-1){
perror("opendelfiledestinazione");
exit(3);
}
while(1) {int num_byte;
if((num_byte = read(fd_orig, buffer, BUFFER_LENGTH)) == -1) {
perror("errore in lettura");exit(4);
}else if(num_byte==0)break;
if(write(fd_dest, buffer, num_byte) == -1) {perror("errore in scrittura");exit(5);
}}
return 0;}
/* Fine io_basso_liv.c */
GiorgioGiacinto2016
SistemiOperativi
20
I/Odibassolivello:verificaditipoestatistichesufile» Lafunzioneisatty() (man 3 isatty)
#include <unistd.h>int isatty(int desc);
restituisce1 sedesc èlegatoadunterminale,altrimentirestituisce0
» Lefunzionistat() e fstat() (man 2 fstat)#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int stat(const char *file_name, struct stat *buf);int fstat(int filedes, struct stat *buf);
Restituisceinformazionisulfile(timestamp dell'ultimoaccesso,dell'ultimamodifica,
UIDeGIDdelproprietario,ecc).
Leinformazionivengonosalvatenellastrutturadatibuf
GiorgioGiacinto2016
SistemiOperativi
21