Esercitazione: Utilizzo delle Pipe

Documenti analoghi
Pipes e named pipes: 1. Nozioni preliminari 2. Pipes e named pipes (FIFO) in sistemi UNIX 3. Pipes e named pipes sistemi Windows

Sistemi Operativi (M. Cesati)

SmallShell Piccolo processore comandi

Sistemi Operativi (M. Cesati)

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

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

Capitolo 3 -- Silberschatz

Concetto di processo. Processi. Immagine in memoria di un processo. Stati di un processo. Un SO esegue una varietà di attività:

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);

Sistemi Operativi I Corso di Laurea in Ingegneria Informatica Facolta di Ingegneria, Universita La Sapienza Docente: Francesco Quaglia

Esercitazione sui segnali

La creazione di un nuovo processo in UNIX

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

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

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

Sistemi Operativi. Descrizione e controllo dei processi

TECN.PROG.SIST.INF. Creazione di un processo in Windows. Roberta Gerboni

SISTEMI OPERATIVI. Processi in Linux. Giorgio Giacinto Sistemi Operativi

Sistemi Operativi (M. Cesati)

Fondamenti di Informatica T-1 modulo 2

System call per la gestione di processi

Sistemi Operativi (M. Cesati)

System call per la gestione di processi

Fondamenti di Informatica T-1 modulo 2

Sistemi Operativi Teledidattico

Fondamenti di Informatica L-A

Sistemi Operativi (M. Cesati)

Sistemi Operativi. Descrizione e controllo dei processi

Lezione 21. #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/wait.

Sistemi Operativi (M. Cesati)

Chiamate di sistema. Pipe Flussi di I/O

Sistemi Operativi (M. Cesati)

Corso di Programmazione Concorrente Processi. Valter Crescenzi

Sistemi Operativi. Marzo-Giugno 2011 matricole congrue 0 mod 3. Controllo dei processi - I

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

CORSO DI SISTEMI OPERATIVI A - ESERCITAZIONE 4

Programmazione di sistema in Linux: System Call per il controllo processi. E. Mumolo, DIA

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

ESERCITAZIONE 2 fork e exec

Laboratorio di Sistemi Operativi

Sistemi Operativi (M. Cesati)

Sistemi Operativi (M. Cesati)

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

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

Sistemi Operativi (M. Cesati)

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

Sistemi Operativi (M. Cesati)

Sistemi operativi A, Unix+C, 26/09/2017. Nome: Cognome: Matricola:

Sistemi Operativi (M. Cesati)

Funzioni con numero variabile di parametri: Funzioni Variadiche in C. Massimo Benerecetti Laboratorio di Algoritmi e Strutture Dati

Funzioni con numero variabile di parametri: Funzioni Variadiche in C. Massimo Benerecetti Laboratorio di Algoritmi e Strutture Dati

Sistemi Operativi (M. Cesati)

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

Sistemi Operativi (M. Cesati)

Allocazione dinamica memoria

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

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

Esercitazioni Fondamenti di Informatica

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

Esercizio sulla gestione di processi in Unix!

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

Processi: 1. Modelli a stati 2. Rappresentazione di processi 3. Liste di processi e scheduling 4. Processi in sistemi operativi attuali (NT/UNIX)

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

Sistemi Operativi (M. Cesati)

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

- matrici - stringhe - file (lettura/scrittura, di testo/binari) - strutture, puntatori - allocazione dinamica della memoria (malloc)

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

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

Lezione XII.III Gestione dei file Un progetto completo

Corso di Sistemi Operativi Esercitazioni

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

Sistemi Operativi (M. Cesati)

Scrittura formattata - printf

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

Input/Output. Lettura e scrittura Caratteri e Stringhe: Terminale e file. Input/output. caratteri stringhe formattato ascii binari

ELEMENTI DI INFORMATICA LB ESERCITAZIONE (del 09/03/2007) Files, Strutture e Liste

Manualistica 3 Le strutture di controllo

Controllo dei Processi. M. R. Guarracino - Primitive di Controllo dei Processi

Sistemi Operativi (M. Cesati)

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

Sulla libreria standard, II. Manipolare input e output standard

Il compito del 11 novembre 2004

PROGRAMMA = ALGORITMO

Corso di Laurea in Ingegneria Informatica. Sistemi Operativi. Esercitazione semafori. Università degli Studi KORE - Enna. Docente: Mario Collotta

25.25 in base 2: normalizzando: mantissa e esponente rappresentaz. : mantissa e esponente

SC che operano su processi. Fork, exec, etc...

Corso di Sistemi Operativi A.A CHIAMATE DI SISTEMA PER IL CONTROLLO DEI PROCESSI. Fabio Buttussi

La Programmazione di Rete e di Sistema (iii) La programmazione di sistema. Il sistema operativo. La programmazione di sistema

Politecnico di Milano - Dipartimento di Elettronica e informazione Prof. Mauro Negri

Sistemi Operativi (M. Cesati)

Sistemi Operativi (M. Cesati)

file fisico file logico

Sistemi Operativi (M. Cesati)

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

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

Sommario. Manipolazione sequenziale di file in C Funzioni di base per I/O di file

La funzione main() (

Operazioni su file di caratteri

La Comunicazione tra Processi in Unix

Transcript:

Esercitazione: Utilizzo delle Pipe Specifica del problema Struttura generale del programma Esempio per Unix Esempio per Windows 1

Esercizio Realizzazione di una semplice shell che sia in grado di accettare sulla stessa linea più comandi separati dal simbolo. Semantica del simbolo : L output generato dal comando a sinistra di non deve andare sullo standard output della shell (schermo), ma deve essere usato come standard input del comando a destra di. Nota: questo utilizzo del simbolo é molto diffuso sia in shell Unix che Windows 2

Struttura del programma Shell Comando a destra di pipe Comando a sinistra di Unix: generazione di nuovi processi con accoppiata fork() - execvp() Windows: generazione di nuovi processi con CreateProcess(); 3

Descrizione del main() int main () { /* Dichiarazione variabili */ while (1) { /* Legge la linea di comando * * esce se il comando e exit */ do { /* Genera un processo con gli eventuali pipe sullo * * stdout eo sullo stdin */ while (next_command!= NULL); /* Attende che i comandi lanciati siano terminati */ /* Terminazione della shell */ 4

Unix - Inclusioni #include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <errno.h> #include <string.h> #include <malloc.h> #include <sys/wait.h> #define COMMAND_LENGTH 1024 Dichiarazioni di variabili del main() char *command_pointer, *next_command; char line[command_length+1]; char **arg; int *old_pipe_descriptors; int *new_pipe_descriptors; int arg_num; int pipe_present=0, pipe_pending=0; int pending_processes; int i, status; 5

int main () { /* Dichiarazione variabili */ while (1) { /* Legge la linea di comando * * esce se il comando e exit */ do { /* Genera un processo con gli eventuali pipe sullo * * stdout eo sullo stdin */ while (next_command!= NULL); /* Attende che i comandi lanciati siano terminati */ /* Terminazione della shell */ 6

Unix lettura linea di comando printf("\nexample Shell"); if (geteuid() == 0) printf("#"); else printf(">"); fflush(stdout); fgets(line,command_length,stdin); line[command_length] = '\0'; if (strlen(line) == COMMAND_LENGTH) { printf("\ncommand too long!\n"); continue; pending_processes = 0; command_pointer = line; if (strcmp(command_pointer, "exit\n") == 0) break; 7

int main () { /* Dichiarazione variabili */ while (1) { /* Legge la linea di comando * * esce se il comando e exit */ do { /* Genera un processo con gli eventuali pipe sullo * * stdout eo sullo stdin */ while (next_command!= NULL); /* Attende che i comandi lanciati siano terminati */ /* Terminazione della shell */ 8

Unix Parsing del comando arg_num = count_args(command_pointer, &pipe_present, &next_command); if (arg_num < 0) break; arg = build_arg_vector(command_pointer, arg_num, pipe_present); if(pipe_present) { new_pipe_descriptors = malloc(sizeof(int)*2); if (pipe (new_pipe_descriptors) < 0) { printf("can't open a pipe for error %d!\n", errno); fflush(stdout); exit(-1); 9

Unix - Generazione di un processo (I) if ((i=fork()) == 0) { if (pipe_pending) { close(0); dup(old_pipe_descriptors[0]); close(old_pipe_descriptors[0]); if (pipe_present) { close(1); dup(new_pipe_descriptors[1]); close(new_pipe_descriptors[1]); execvp(arg[0],arg); printf("can't execute file %s\n",arg[0]); fflush(stdout); exit(-1); else... 10

Unix Generazione di un processo (II)... if (i>0) { pending_processes++; if (pipe_pending) { close(old_pipe_descriptors[0]); free(old_pipe_descriptors); pipe_pending = 0; if (pipe_present) { close(new_pipe_descriptors[1]); old_pipe_descriptors = new_pipe_descriptors; pipe_pending = 1; else { printf("can't spawn process for error %d\n", errno); fflush(stdout); command_pointer = next_command; 11

int main () { /* Dichiarazione variabili */ while (1) { /* Legge la linea di comando * * esce se il comando e exit */ do { /* Genera un processo con gli eventuali pipe sullo * * stdout eo sullo stdin */ while (next_command!= NULL); /* Attende che i comandi lanciati siano terminati */ /* Terminazione della shell */ 12

Unix - Attesa terminazione processi for (i=0; i<pending_processes; i++) { wait(&status); Unix - Terminazione Shell printf("\nleaving Shell\n\n"); return(0); 13

Funzione count_args() int count_args(char *start_command, int *pipe_present, char **next_command) { char copied_string[command_length + 1]; char *temp, *temp_next; int args = 0, i; strcpy(copied_string, start_command); if (((temp = strtok(copied_string, " \n")) == NULL) (strcmp(temp, "\0") == 0)) return(-1); args++; while (((temp = strtok(null, " \n"))!= NULL) && (strcmp(temp, " ")!= 0 )) { if (strcmp(temp, "\0") == 0 ) break; args++; if (temp == NULL) { *pipe_present = 0; *next_command = NULL; else { if ((temp = strtok(null, " \n"))!= NULL) { *pipe_present = 1; for (i=0; ; i++) if (copied_string[i] == ' ') break; *next_command = start_command + i + 2; else { *pipe_present = 0; *next_command = NULL; return(args); 14

Funzione build_arg_vector() char **build_arg_vector(char *command, int arg_num, int pipe_present) { char **arg_vector; char *temp; int i; arg_vector = malloc((arg_num+1) * sizeof(char *)); for(i=0; i < arg_num; i++) { if (i==0) temp = strtok(command, " \n"); else temp = strtok(null, " \n"); arg_vector[i] = temp; arg_vector[i] = NULL; return(arg_vector); 15

Differenze Unix-Windows int main () { /* Dichiarazione variabili */ while (1) { /* Legge la linea di comando * * esce se il comando e exit */ do { /* Genera un processo con gli eventuali pipe sullo * * stdout eo sullo stdin */ while (next_command!= NULL); /* Attende che i comandi lanciati siano terminati */ /* Terminazione della shell */ 16

Windows - Inclusioni #include <windows.h> #include <stdio.h> #include <string.h> #include <malloc.h> #define COMMAND_LENGTH 1024 Dichiarazioni di variabili del main() char *command_pointer, *next_command; char line[command_length+1]; char command_line[command_length+1]; char **arg; HANDLE *old_pipe_handles; HANDLE *new_pipe_handles; SECURITY_ATTRIBUTES security; HANDLE temp_readhandle; HANDLE temp_writehandle; HANDLE pending_processes_handles[maximum_wait_objects]; BOOL newprocess; STARTUPINFO si; PROCESS_INFORMATION pi; int arg_num; int pipe_present=0, pipe_pending=0; int pending_processes; 17

Windows Parsing del comando arg_num = count_args(command_pointer, &pipe_present, &next_command); if (arg_num < 0) break; arg = build_arg_vector(command_pointer, arg_num, pipe_present); build_command_line(arg, command_line, arg_num); if(pipe_present) { new_pipe_handles = malloc(sizeof(handle)*2); security.nlength = sizeof(security); security.lpsecuritydescriptor = NULL; security.binherithandle = TRUE; if (CreatePipe (&new_pipe_handles[0], &new_pipe_handles[1], &security, 0) < 0) { printf("can't open a pipe for error %d!\n", GetLastError()); fflush(stdout); ExitProcess(-1); 18

Windows - Generazione di processo (I) if (pipe_pending) { temp_readhandle = GetStdHandle(STD_INPUT_HANDLE); SetStdHandle(STD_INPUT_HANDLE, old_pipe_handles[0]); if (pipe_present) { temp_writehandle = GetStdHandle(STD_OUTPUT_HANDLE); SetStdHandle(STD_OUTPUT_HANDLE, new_pipe_handles[1]); memset(&si, 0, sizeof(si)); memset(&pi, 0, sizeof(pi)); si.cb = sizeof(si); newprocess = CreateProcess(NULL, command_line, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); 19

Windows - Generazione di processo (II) if (pipe_pending) { SetStdHandle(STD_INPUT_HANDLE, temp_readhandle); CloseHandle(old_pipe_handles[0]); free(old_pipe_handles); pipe_pending = 0; if (pipe_present) { SetStdHandle(STD_OUTPUT_HANDLE, temp_writehandle); CloseHandle(new_pipe_handles[1]); old_pipe_handles = new_pipe_handles; pipe_pending = 1; if (newprocess == 0) { printf("can't spawn executable %s!\n", arg[0]); break; pending_processes_handles[pending_processes] = pi.hprocess; pending_processes++; command_pointer = next_command; 20

Windows - Attesa terminazione processi do { /* Generazione del processo */ pending_processes_handles[pending_processes] = pi.hprocess; pending_processes++;... while (next_command!= NULL);......... WaitForMultipleObjects(pending_processes, pending_processes_handles, TRUE, INFINITE); 21

Windows - Attesa terminazione processi do { /* Generazione del processo */ pending_processes_handles[pending_processes] = pi.hprocess; pending_processes++;... while (next_command!= NULL);......... WaitForMultipleObjects(pending_processes, pending_processes_handles, TRUE, INFINITE); 22

Windows build_command_line() void build_command_line(char **arg, char *line, int num) { int i; for(i=0; i<num; i++) { sprintf(line, "%s", arg[i]); line += strlen(arg[i]); *line = ' '; line += 1; *(line - 1) = '\0'; return; 23