Diffusione dei linguaggi di programmazione IEEE 2016 · programma tramite riga di comando facendo...

11
Linguaggio C e Linux SISTEMI OPERATIVI Diffusione dei linguaggi di programmazione IEEE 2016 Giorgio Giacinto 2016 2 Sistemi Operativi

Transcript of Diffusione dei linguaggi di programmazione IEEE 2016 · programma tramite riga di comando facendo...

Page 1: Diffusione dei linguaggi di programmazione IEEE 2016 · programma tramite riga di comando facendo uso dei parametri argce argvdella funzione main() ˃ argc: un valore intero che specifica

LinguaggioCeLinux

SISTEMIOPERATIVI

DiffusionedeilinguaggidiprogrammazioneIEEE2016

GiorgioGiacinto2016

2

SistemiOperativi

Page 2: Diffusione dei linguaggi di programmazione IEEE 2016 · programma tramite riga di comando facendo uso dei parametri argce argvdella funzione main() ˃ argc: un valore intero che specifica

DiffusionedeilinguaggidiprogrammazioneIEEE2015e2014

GiorgioGiacinto2016

3

SistemiOperativi

2015 2014

Diffusionedeilinguaggidiprogrammazione

GiorgioGiacinto2016

4

SistemiOperativi

Page 3: Diffusione dei linguaggi di programmazione IEEE 2016 · programma tramite riga di comando facendo uso dei parametri argce argvdella funzione main() ˃ argc: un valore intero che specifica

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

Page 4: Diffusione dei linguaggi di programmazione IEEE 2016 · programma tramite riga di comando facendo uso dei parametri argce argvdella funzione main() ˃ argc: un valore intero che specifica

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

Page 5: Diffusione dei linguaggi di programmazione IEEE 2016 · programma tramite riga di comando facendo uso dei parametri argce argvdella funzione main() ˃ argc: un valore intero che specifica

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

Page 6: Diffusione dei linguaggi di programmazione IEEE 2016 · programma tramite riga di comando facendo uso dei parametri argce argvdella funzione main() ˃ argc: un valore intero che specifica

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

Page 7: Diffusione dei linguaggi di programmazione IEEE 2016 · programma tramite riga di comando facendo uso dei parametri argce argvdella funzione main() ˃ argc: un valore intero che specifica

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

Page 8: Diffusione dei linguaggi di programmazione IEEE 2016 · programma tramite riga di comando facendo uso dei parametri argce argvdella funzione main() ˃ argc: un valore intero che specifica

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

Page 9: Diffusione dei linguaggi di programmazione IEEE 2016 · programma tramite riga di comando facendo uso dei parametri argce argvdella funzione main() ˃ argc: un valore intero che specifica

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

Page 10: Diffusione dei linguaggi di programmazione IEEE 2016 · programma tramite riga di comando facendo uso dei parametri argce argvdella funzione main() ˃ argc: un valore intero che specifica

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

Page 11: Diffusione dei linguaggi di programmazione IEEE 2016 · programma tramite riga di comando facendo uso dei parametri argce argvdella funzione main() ˃ argc: un valore intero che specifica

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