Sistemi Operativi. Bruschi Monga Re. Shell Esercizi Shell programming Esercizi I/O. Sistemi Operativi. Bruschi Monga Re

Documenti analoghi
Sistemi Operativi 1. Mattia Monga. a.a. 2015/16. Dip. di Informatica Università degli Studi di Milano, Italia

Sistemi Operativi 1. Mattia Monga. a.a. 2018/19. Dip. di Informatica Università degli Studi di Milano, Italia

Sistemi Operativi. Bruschi Martignoni Monga. Le astrazioni del s.o. MINIX syscall. Shell Esercizi Shell programming Esercizi.

Sistemi Operativi 1. Mattia Monga. a.a. 2012/13. Dip. di Informatica Università degli Studi di Milano, Italia

Sistemi Operativi 1. Mattia Monga. a.a. 2010/11. Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia

Sistemi Operativi 1. Mattia Monga. a.a. 2013/14. Dip. di Informatica Università degli Studi di Milano, Italia

Sistemi Operativi (Laboratorio)

Sistemi Operativi (Laboratorio)

Avviso. man sh. Sistemi Operativi (Laboratorio) Lezione III: Shell 2. Un vero linguaggio di programmazione

Sistemi Operativi 1. Mattia Monga. a.a. 2015/16. Dip. di Informatica Università degli Studi di Milano, Italia

Sistemi Operativi 1. Lezione III: Concetti fondamentali. Mattia Monga. 7 marzo 2008

Sistemi Operativi 1. Mattia Monga. 7 marzo Dip. di Informatica e Comunicazione Università degli Studi di Milano, Italia

Sistemi Operativi. Bruschi Monga Re. Sincronizzazione con monitor pthreads. Shell Shell programming Esercizi I/O Esercizi Tabella riassuntiva

Sistemi Operativi. Bruschi Monga Re. Shell e file system. File system. Unix power tools. Esercizi. Sistemi Operativi.

Sistemi Operativi 1. Mattia Monga. a.a. 2017/18. Dip. di Informatica Università degli Studi di Milano, Italia

Chiamate di sistema. Pipe Flussi di I/O

Chiamate di sistema. Pipe Flus s i di I/O

Filtri e pipeline. qualsiasi comando unix ha a disposizione 3 file con cui comunicare con il resto del sistema: standard input in ingresso

case 0: /* child 1 - writing end */ close(fd[0]); // close read end write(fd[1], string, (strlen(string)+1));/* +1 is termination \0 */ return (0);

Esercizi su permessi

Sistemi Operativi Teledidattico

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

Laboratorio di Sistemi Operativi primavera 2009

Sistemi Operativi (M. Cesati)

La Comunicazione tra Processi in Unix

SmallShell Piccolo processore comandi

Sistemi Operativi e informatica 1

Sistemi Operativi (M. Cesati)

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

Esercitazione 4. Gestione dei file in Unix

La Comunicazione tra Processi in Unix

La creazione di un nuovo processo in UNIX

Corso di Laboratorio di Sistemi Operativi

Sistemi di Calcolo - Secondo modulo (SC2) Programmazione dei Sistemi di Calcolo Multi-Nodo

Introduzione alla programmazione nella shell di Unix 10 Maggio 2005

SISTEMI OPERATIVI. Processi in Linux. Giorgio Giacinto Sistemi Operativi

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 4

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

Corso di Programmazione Concorrente Processi. Valter Crescenzi

Sistemi operativi Modulo II I semafori 2 Select

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 4 24/10/2013

SC per Inter Process Comminication. Pipe senza nome e con nome (FIFO)

SISTEMI OPERATIVI e LABORATORIO DI SISTEMI OPERATIVI (A.A ) 31 MARZO 2006

Lab. di Sistemi Operativi - Esercitazione n 9- -Thread-

a strange language, shaped as much by history as by design

Esercizio sulla gestione di file in Unix. Sistemi Operativi T AA

Esercitazione: Utilizzo delle Pipe

Il linguaggio C. Breve panoramica su stdio.h

Chiamate di sistema per la Inter Process Communication (IPC) in POSIX. E.Mumolo, DEEI

ESERCITAZIONE 2 fork e exec

Sistemi Operativi 1. Mattia Monga. a.a. 2012/13. Dip. di Informatica Università degli Studi di Milano, Italia

Unix e comandi di base

Esercizio sulla gestione di processi in Unix!

Page 1. Programmazione. Shell e programmazione. File comandi (script) Introduzione alla programmazione nella shell di Unix

System calls. permettono ai programmi utente di richiedere servizi al Sistema Operativo. servizi come scrittura di file, stampa su video, ecc.

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

Lab 19 Unix e comandi di base

System call per la gestione di processi

Inter-process communication

System call per la gestione di processi

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

Comunicazione tra processi: pipe Le pipe sono un meccanismo UNIX di Inter Process Communication (IPC)

Il sistema operativo LINUX Esercitazione 3

Lezione 5 in laboratorio processi, stringhe

Laboratorio Sistemi Operativi

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

Lab. di Sistemi Operativi - Esercitazione n 3 - a.a. 2016/2017. Script shell

Sistemi Operativi (M. Cesati)

Lezione 22: Input/Output e Files

SC per Inter Process Communication. Pipe senza nome e con nome (FIFO)

Operazioni su file di caratteri

Fondamenti di Informatica e Laboratorio T-AB Ingegneria Elettronica e Telecomunicazioni. Lab Shell. Lab-Shell 1

Addendum alle chiamate di sistema per la gestione processi. E Mumolo

" &$ () " ) ) $ ' () *) " ) $

Lab. di Sistemi Operativi - Esercitazione n 2- - comando di ricerca: grep -

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

Directory. Le directory unix sono file.

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

Laboratorio di Sistemi Operativi

Sistemi Operativi (M. Cesati)

Sistemi Operativi (M. Cesati)

Shell BASH. Variabili Redirezione

LABORATORIO DI SISTEMI OPERATIVI

- Controllo di flusso: for -

Lezione 11: Liste a Puntatori e Input/Output

UNIX. UNIX: history. shell come interprete. Unix shell. The layers of a UNIX system.

La funzione main() La funzione main(), presente in tutti i programmi C, è una funzione come tutte le altre

Parte Input e output in linguaggio i C. 3. Programmazione strutturata 1 (if, switch, comunque segnalare dei warning

Seconda Esercitazione. Gestione di processi in Unix Primitive Fork, Wait, Exec

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

Fondamenti di informatica, Sez. Ing. Informatica, Ing. Gestionale, Ing. Ambientale II prova in itinere, 29 Gennaio 2009

Lab. di Sistemi Operativi - Esercitazione n 7- -Gestione dei processi Unix-

CORSO LINUX PER LA CERTIFICAZIONE LPI ESSENTIALS

System Calls per la Gestione dei Processi

Università degli Studi di Verona. Esercizi. Gennaio Sergio Marin Vargas. Dipartimento di Biotecnologie

Il comando make. Per produrre un eseguibile da un programma C sono necessari tre passi compiuti dai seguenti moduli:

Transcript:

1 Mattia Monga Lezione XI: Processi, shell, file Dip. di Informatica Università degli Studi di Milano, Italia mattia.monga@unimi.it a.a. 201/16 1 cba 2008 16 M. Monga. Creative Commons Attribuzione Condividi allo stesso modo 4.0 Internazionale. http://creativecommons.org/licenses/by-sa/4.0/deed.it.. Immagini tratte da [2] e da Wikipedia. 1 211 shell (pseudo codice) La shell è l interprete dei comandi che l utente dà al sistema operativo. Ne esistono grafiche e testuali. In ambito GNU/Linux la piú diffusa è una shell testuale bash, che fornisce i costrutti base di un linguaggio di programmazione (variabili, strutture di controllo) e primitive per la gestione dei processi e dei file. 1 while (1){ / repeat forever / 2 type prompt(); / display prompt on the screen / 3 read command(command, parameters); / read input from terminal / 4 if (fork() > 0){ / fork off child process / / Parent code. / 6 waitpid(1, &status, 0); / wait for child to exit / 7 } else { 8 / Child code. / 9 execve(command, parameters, 0); / execute command / 10 } 11 } 212 213

Lanciare programmi con la shell Per iniziare l esecuzione di un programma basta scrivere il nome del file /bin/ls Il programma è trattato come una funzione, che prende dei parametri e ritorna un intero (int main(int argc, char*argv[])). Convenzione: 0 significa non ci sono stati errori, > 0 errori (2 errore nei parametri), parametri - opzioni /bin/ls /usr /bin/ls piripacchio Si può evitare che il padre aspetti la terminazione del figlio /bin/ls /usr & Due programmi in sequenza /bin/ls /usr ; /bin/ls /usr Due programmi in parallelo /bin/ls /usr & /bin/ls /usr 214 1 Scrivere, compilare (cc o nome nome.c) ed eseguire un programma che forca un nuovo processo. 2 Scrivere un programma che stampi sullo schermo Hello world! (numero) per 10 volte alla distanza di 1 secondo l una dall altra (sleep(int)). Terminare il programma con una chiamata exit(0) 3 Usare il programma precedente per sperimentare l esecuzione in sequenza e in parallelo 4 Controllare il valore di ritorno con /bin/echo $? Tradurre il programma in assembly con cc S masm=intel nome.c 6 Modificare l assembly affinché il programmi esca con valore di ritorno 3 e controllare con echo $? dopo aver compilato con cc -o nome nome.s 21 POSIX Syscall (file mgt) POSIX Syscall (file mgt cont.) 216 217

File File (cont.) 1 int main(){ 2 pid t pid; 3 int f, off; 4 char string[] = Hello, world!\n ; 6 lsofd( padre (senza figli) ); 7 printf( padre (senza figli) open \n ); 8 f = open( provaxxx.dat, O CREAT O WRONLY O TRUNC, S IRWXU); 9 if (f == 1){ 10 perror( open ); 11 exit(1); 12 } 13 lsofd( padre (senza figli) ); 14 if (write(f, string, (strlen(string)))!= (strlen(string)) ){ 1 perror( write ); 16 exit(1); 17 } 18 19 off = lseek(f, 0, SEEK CUR); 20 printf( padre (senza figli) seek: %d\n, off); 21 22 printf( padre (senza figli) fork \n ); 23 if ( (pid = fork()) < 0){ 24 perror( fork ); 2 exit(1); 26 } 218 1 if (pid > 0){ 2 lsofd( padre ); 3 printf( padre write & close \n ); 4 off = lseek(f, 0, SEEK CUR); printf( padre seek prima: %d\n, off); 6 if (write(f, string, (strlen(string)))!= (strlen(string)) ){ 7 perror( write ); 8 exit(1); 9 } 10 lsofd( padre ); 11 off = lseek(f, 0, SEEK CUR); 12 printf( padre seek dopo: %d\n, off); 13 close(f); 14 exit(0); 1 } 16 else { 17 lsofd( figlio ); 18 printf( figlio write & close \n ); 19 off = lseek(f, 0, SEEK CUR); 20 printf( figlio seek prima: %d\n, off); 21 if (write(f, string, (strlen(string)))!= (strlen(string)) ){ 22 perror( write ); 23 exit(1); 24 } 2 lsofd( figlio ); 26 off = lseek(f, 0, SEEK CUR); 27 printf( figlio seek dopo: %d\n, off); 28 close(f); 29 exit(0); 30 } 31 } 219 Un vero linguaggio di programmazione Per fare esperimenti con i file descriptor può essere utile una funzione come la seguente 1 #include <stdio.h> 2 #include <sys/stat.h> 3 #define POSIX SOURCE 4 #include <limits.h> 6 void lsofd(const char name){ 7 int i; 8 for (i=0; i< POSIX OPEN MAX; i++){ 9 struct stat buf; 10 if (fstat(i, &buf) == 0){ 11 printf( %s fd:%d i node: %d\n, name, i, (int)buf.st ino); 12 } 13 } 14 } 220 La shell è un vero (Turing-completo) linguaggio di programmazione (interpretato) Variabili (create al primo assegnamento, uso con $, export in un altra shell). x= ciao ; y=2 ; /bin/echo $x $y $x Istruzioni condizionali (valore di ritorno 0 true) 221 if /bin/ls piripacchio; then /bin/echo ciao; else /bin/echo buonasera; fi Iterazioni su insiemi for i in a b c d e; do /bin/echo $i; done Cicli 1 /usr/bin/touch piripacchio 2 while /bin/ls piripacchio; do 3 /usr/bin/sleep 2 4 /bin/echo ciao done & ( /usr/bin/sleep 10 ; /bin/rm piripacchio )

Input e Output 1 Per ciascuno dei file dog, cat, fish controllare se esistono nella directory bin (hint: usare /bin/ls e nel caso scrivere Trovato ) 2 Consultare il manuale (programma /usr/bin/man) del programma /bin/test (per il manuale man test) 3 Riscrivere il primo esercizio facendo uso di test 222 In generale il paradigma UNIX permette alle applicazioni di fare tramite: Input Parametri al momento del lancio Variabili d ambiente File (tutto ciò che può essere gestito con le syscall open, read, write, close) Terminale (interfaccia testuale) Device (per es. il mouse potrebbe essere /dev/mouse) Rete (socket) Output Valore di ritorno Variabili d ambiente File (tutto ciò che può essere gestito con le syscall open, read, write, close) Terminale (interfaccia testuale) Device (per es. lo schermo in modalità grafica potrebbe essere /dev/fb) Rete (socket) 223 Redirezioni Pipe Ad ogni processo sono sempre associati tre file (già aperti) Standard input (Terminale, tastiera) Standard output (Terminale, video) Standard error (Terminale, video, usato per le segnalazione d errore) Possono essere rediretti /usr/bin/sort < lista Lo stdin è il file lista /bin/ls > lista Lo stdout è il file lista /bin/ls piripacchio 2> lista Lo stderr è il file lista ( echo ciao & date ; ls piripacchio ) 2> errori 1>output 224 ls sort 1 int main(void){ 2 int fd[2], nbytes; pid t childpid; 3 char string[] = Hello, world!\n ; 4 char readbuffer[80]; 6 pipe(fd); 7 if(fork() == 0){ 8 / Child process closes up input side of pipe / 9 close(fd[0]); 10 write(fd[1], string, (strlen(string)+1)); 11 exit(0); 12 } else { 13 / Parent process closes up output side of pipe / 14 close(fd[1]); 1 nbytes = read(fd[0], readbuffer, sizeof(readbuffer)); 16 printf( Received string: %s, readbuffer); 17 } 18 return(0);} 22

Pipe (cont.) Pipe 1 if(fork() == 0) 2 { 3 / Close up standard input of the child / 4 close(0); 6 / Duplicate the input side of pipe to stdin / 7 dup(fd[0]); 8 execlp( sort, sort, NULL); 9 } La pipe è un canale, analogo ad un file, bufferizzato in cui un processo scrive e un altro legge. Con la shell è possibile collegare due processi tramite una pipe anonima. Lo stdout del primo diventa lo stdin del secondo /bin/ls sort ls lr / sort more funzionalmente equivalente a ls lr >tmp1; sort <tmp1 >tmp2; more<tmp2; rm tmp Molti programmi copiano lo stdin su stdout dopo averlo elaborato: sono detti filtri. 226 227 410