1 © 2005-2007 F. Pedullà, M. VerolaAA 2008-2009 La famiglia di system call exec LSO1 Modulo 6 La famiglia di system call exec Laboratorio di Sistemi Operativi.

Slides:



Advertisements
Presentazioni simili
INFORMATICA Altre Istruzioni di I/O
Advertisements

PROCESS MANAGEMENT: STRUTTURE DATI
Shell: variabili di sistema PATH HOME USER PWD SHELL HOSTNAME HOSTTYPE Per visualizzare il valore di tutte le variabili dambiente si usa il comando set.
SC che operano su processi
SC che operano su file (1)
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Costruzione di Interfacce Lezione 10 Dal Java al C++ parte 1
Organizzazione della Memoria (Unix) Text contiene le istruzioni in linguaggio macchina del codice eseguibile, può essere condiviso in caso di processi.
1 LINUX: struttura generale The layers of a UNIX system. User Interface.
Sistemi Operativi - Shell 1 Elementi di programmazione concorrente Niccolo` Battezzati Politecnico di Torino Dip. Automatica e Informatica.
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
1 Scheduling in Windows 2000 Un thread entra in modalità kernel e chiama lo scheduler quando: Si blocca su un oggetto di sincronizzazione (semaforo, mutex,
T. MottaGenerazione e terminazione processi1 Creazione e terminazione dei processi Tommaso Motta
1 SC che operano su processi Getpid, fork, exec, wait, waitpid, exit, dup, dup2.
1 Chiamate di sistema Introduzione Errori : perror() Chiamate che lavorano su file.
Programmazione di sistema e gestione dei processi in C.
Ancora sulla shell. Shell e comandi La shell e' un programma che interpreta i comandi dell'utente. I comandi possono essere dati da terminale, oppure.
1 System Call che operano su processi Getpid, fork, exec, wait, waitpid, exit, dup, dup2.
1 System Call che operano su processi Getpid, fork, exec, wait, waitpid, exit, dup, dup2.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Approfondimenti di C, Stringhe e file 13 Stringhe.
Script bash I file di comandi in Linux. BASH  Bourne Again Shell  Modalità interattiva o batch (file di comandi)  Ambiente di programmazione “completo”
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – Ver. aggiornata al 6 Marzo 2016.
1 Elementi DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
1 © F. Pedullà, M. VerolaAA System call per il controllo dei processi (fork, exit, wait) LSO1 Modulo 5 System call per il controllo.
1 © F. Pedullà, M. VerolaAA vi e sed LSO1 Modulo 2 - Appendice 3 L'editor vi e cenni su sed Laboratorio di Sistemi Operativi I Anno.
1 © F. Pedullà, M. VerolaAA Comandi Esterni LSO1 Modulo 2 - Appendice 2 Breve rassegna di comandi (esterni) in ambiente Linux Laboratorio.
1 ELEMENTI DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
1 © F. Pedullà, M. VerolaAA Introduzione alle system call LSO1 Modulo 4: Sezione A Introduzione alle system call Laboratorio di Sistemi.
1 © F. Pedullà, M. VerolaAA Pipe e FIFO LSO1 Modulo 9 Pipe e FIFO Laboratorio di Sistemi Operativi I Anno Accademico Francesco.
1 © 2007 Renzo Davoli, Alberto Montresor, Mauro Morsiani Laboratorio di Sistemi Operativi Anno Accademico AMIKaya: criteri di valutazione del.
Programmazione in Java Parte II Lezione 5 Dott. Marco Faella.
.  I tipi di dati non primitivi sono gli array, le struct e le union.  Gli array sono degli aggregati di variabili dello stesso tipo.  La dichiarazione.
Gestione della memoria
Ambienti di Programmazione per il Software di Base
Modulo 5: Programmazione di sistema ---
I/O redirection AND PIPES
I PROCESSI.
Introduzione al linguaggio C
Terza Lezione → Navigare nel file System → parte 2
Tutorato Elementi di Informatica 2013
7. Strutture di controllo Ing. Simona Colucci
I PERMESSI IN LINUX.
Seconda lezione → Navigare nel File System
La famiglia di system call exec Laboratorio di Sistemi Operativi I
I FILES AD ACCESSO SEQUENZIALE
Tipo di dato: array Un array è un tipo di dato usato per memorizzare una collezione di variabili dello stesso tipo. Per memorizzare una collezione di 7.
2018/9/ /9/11 USER ENVIRONMENT 1 1.
PROGRAMMAZIONE BASH – ISTRUZIONE IF
Ambienti di Programmazione per il Software di Base
Tipi di Shell sh – Bourne shell csh – C shell ksh – Korn shell
Programmare.
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
File System ed Input/Output
APPUNTI SUL LINGUAGGIO C
LINUX: struttura generale
Esercizio 1 Scrivete un programma C "creaproc" che crea (mediante fork) il numero di processi specificati in input. ad esempio: $> creaproc 7 crea 7 nuovi.
La struttura dei primi programma in C
APPUNTI SUL LINGUAGGIO C Esercizi su File e Alberi Binari
APPUNTI SUL LINGUAGGIO C Allocazione dinamica della memoria
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Array e Stringhe Linguaggio C.
PowerShell di Windows PowerShell è un shell che mette a disposizione un prompt interattivo e un interprete a riga di comando , per le sue caratteristiche.
Programmazione e Laboratorio di Programmazione
Transcript della presentazione:

1 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 Modulo 6 La famiglia di system call exec Laboratorio di Sistemi Operativi I Anno Accademico Modulo 6 La famiglia di system call exec Laboratorio di Sistemi Operativi I Anno Accademico Copyright © Francesco Pedullà, Massimo Verola Copyright © Renzo Davoli, Alberto Montresor (Universitá di Bologna) Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license can be found at:

2 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 Se fork fosse l’unica primitiva per creare nuovi processi, la programmazione in ambiente Unix sarebbe alquanto ostica, dato che si potrebbero creare soltanto copie dello stesso processo. La famiglia di primitive exec può essere utilizzata per superare tale limite in quanto le varie system call exec permettono di iniziare l’esecuzione di un altro programma sovrascrivendo la memoria del processo chiamante. La famiglia di system call exec In realtà tutte le funzioni chiamano in ultima analisi execve che è l’unica vera system call della famiglia. Le differenze tra le varianti stanno nel modo in cui vengono passati i parametri. execl execle execlp execv execvp execve

3 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 #include main() { printf("Esecuzione di ls\n"); execl("/bin/ls", "ls", "-l", (char *)0); perror("La chiamata di execl ha generato un errore\n"); exit(1); } Si noti che execl elimina il programma originale sovrascrivendolo con quello passato come parametro. Quindi le istruzioni che seguono una chiamata a execl verranno eseguite soltanto in caso si verifichi un errore durante l’esecuzione di quest’ultima ed il controllo ritorni al chiamante. Esempio di utilizzo di execl

4 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 Esempio di utilizzo di execl

5 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 Quando un processo chiama una delle system call exec: il processo viene rimpiazzato completamente da un nuovo programma (text, data, heap, stack vengono sostituiti) il nuovo programma inizia a partire dalla sua funzione main il process ID non cambia Esistono sei versioni di exec : con/senza gestione della variabile di ambiente PATH se viene gestita la variabile d'ambiente, un comando corrispondente ad un singolo filename verrà cercato nel PATH con variabili di ambiente ereditate / con variabili di ambiente specificate con array di argomenti / con argomenti nella chiamata (null terminated) Chiamata alla system call exec

6 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 int execl(char *pathname, char *arg0, … ); int execv(char *pathname, char *argv[]); int execle(char *pathname, char *arg0, …, char* envp[]); int execve(char *pathname, char *argv[], char* envp[]); int execlp(char *filename, char *arg0, … ); int execvp(char *filename, char *argv[]); Le varianti della system call exec

7 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 evlp lettere del suffisso execve execvp execv execle execlp execl envp[ ]environargv[ ]arg listfilenamepathnameFunzione Relazione tra suffisso e parametri di exec

8 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 Cosa viene ereditato da exec ? process ID e parent process ID real uid e real gid supplementary gid process group ID session ID terminale di controllo current working directory root directory maschera creazione file (umask) file locks maschera dei segnali segnali in attesa Proprietà ereditate dal processo lanciato con exec

9 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 Cosa NON viene ereditato da exec ? effective user ID e effective group ID, in quanto vengono settati in base ai valori dei bit di protezione Cosa succede ai file aperti? Dipende dal flag close-on-exec che è associato ad ogni descrittore Se close-on-exec è true, vengono chiusi Altrimenti, vengono lasciati aperti (comportamento di default) Proprietà NON ereditate dal processo lanciato con exec

10 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 L’utilizzo combinato di fork per creare un nuovo processo e di exec per eseguire nel processo figlio un nuovo programma costituisce un potente strumento di programmazione in ambiente Linux Esempio: #include void fatal(char *s) { perror(s); exit(1); } /* continua... */ Utilizzo combinato di fork e exec

11 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 main() { pid_t pid; switch(pid = fork()) { case -1: fatal("fork failed"); break; case 0: execl("/bin/ls", "ls", "-l", (char *)0); fatal("exec failed"); break; default: wait((int *)0); printf("ls completed\n"); exit(0); } Utilizzo combinato di fork e exec

12 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 Utilizzo combinato di fork e exec

13 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 A)Scrivere un programma che manda in esecuzione un eseguibile il cui filename e’ inserito come argomento sulla linea comando e ne aspetta la terminazione. B)Aggiungere al programma precedente la capacità di lanciare eseguibili residenti in qualsiasi directory memorizzata nella variabile di ambiente $PATH. Esercitazione 1

14 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 int system(char* command); Esegue un comando, aspettando la sua terminazione E' una funzione della libreria standard definita in ANSI C (quindi non è una system call, anche se svolge una funzione analoga alla fork+exec) Il suo modo di operare è fortemente dipendente dal sistema; in genere chiama /bin/sh -c command Non è definita in POSIX.1, perché non è un'interfaccia al sistema operativo, ma è definita in POSIX.2 La funzione system

15 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 L’ambiente di un processo è un insieme di stringhe (terminate da \0). Un ambiente è rappresentato da un vettore di puntatori a caratteri terminato da un puntatore nullo. Ogni puntatore (che non sia quello nullo) punta ad una stringa della forma: identificatore = valore Per accedere all’ambiente da un programma C, è sufficiente aggiungere il parametro envp a quelli del main: /* showmyenv */ #include main(int argc, char **argv, char **envp) { while(*envp) printf("%s\n",*envp++); } oppure usare la variabile globale seguente: extern char **environ; L'ambiente di un processo

16 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 L’ambiente di default di un processo coincide con quello del processo padre. Per specificare un nuovo ambiente è necessario usare una delle due varianti seguenti della famiglia exec, memorizzando in envp l’ambiente desiderato: execle(path, arg0, arg1,..., argn, (char *)0, envp); execve(path, argv, envp); L'ambiente di un processo

17 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 /* setmyenv */ #include main() { char *argv[2], *envp[3]; argv[0] = "setmyenv"; argv[1] = (char *)0; envp[0] = "var1=valore1"; envp[1] = "var2=valore2"; envp[2] = (char *)0; execve("./showmyenv", argv, envp); perror("execve fallita"); } Eseguendo il programma precedente si ottiene quanto segue: $./setmyenv var1=valore1 var2=valore2 L'ambiente di un processo

18 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 Esiste una funzione della libreria standard che consente di cercare in environ il valore corrispondente ad una specifica variabile d’ambiente: #include char *getenv(const char *name); getenv prende come argomento il nome della variabile da cercare e restituisce il puntatore al valore (ciò che sta a destra del simbolo =) o NULL se non lo trova: #include main() { printf("PATH=%s\n", getenv("PATH")); } Dualmente, putenv consente di modificare o estendere l’ambiente: putenv("variabile=valore"); L'ambiente di un processo

19 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 Ad ogni processo è associata una current working directory che viene ereditata dal processo padre. La chiamata di sistema seguente consente di cambiarla: #include int chdir(const char *path); Ad ogni processo inoltre è associata una root directory che specifica il punto di inizio del file system visibile dal processo stesso. Per cambiare la root directory si può usare la chiamata di sistema seguente: #include int chroot(const char *path); Current working directory e root directory

20 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 Modificare il programma dell’Esercitazione 1 (slide 13) in accordo alle seguenti ulteriori specifiche: il programma deve supportare correttamente il lancio di eseguibili che richiedono opzioni ed argomenti il pattern di programmazione composto dalla chiamata alle system call fork+exec dovrà essere inserito all’interno di una funzione spawn() il cui prototipo dovrà essere opportunamente definito Aggiungere al programma precedente la capacità di leggere dallo standard input (e non come argomento sulla linea di comando) l’eseguibile da lanciare per poi lanciarlo alla pressione dell’Enter; quest’operazione andra’ ripetuta iterativamente fino alla lettura di un carattere EOF di fine file (sequenza ctrl+d). Esercitazione 2

21 © F. Pedullà, M. VerolaAA La famiglia di system call exec LSO1 A)Aggiungere al programma dell’Esercitazione 2: ➢ la stampa all'inizio di ogni nuova linea di comando (e quindi alla terminazione di ogni eseguibile lanciato) di un prompt contenente il nome dell'utente e quello del computer, nel formato: $ ➢ la capacità di poter lanciare un nuovo eseguibile senza dover attendere la terminazione di quello precedente se al termine della stringa di input si trova il carattere & B)Sviluppare un propria implementazione della funzione system() (si consulti man 3 system), rispettandone il prototipo e la funzionalita’; la gestione dei segnali definita per la system() puo’ essere ignorata. Esercitazione 3