Sistemi di Calcolo

Corso di Laurea in Ingegneria Informatica e Automatica - A.A. 2017-2018

HomePage | Avvisi | Diario lezioni | Programma | Materiale didattico | Esami | Forum | Login

Revision [3380]

Last edited on 2017-11-24 15:53:49 by EmilioCoppa
Additions:
// se voglio che il gestore porti alla terminazione del processo:
// exit(EXIT_SUCCESS);
// se voglio che il gestore porti alla terminazione del processo:
// exit(EXIT_SUCCESS);


Revision [3374]

Edited on 2017-11-24 14:49:59 by EmilioCoppa
Additions:
// exit fa sempre flush dei buffer
Deletions:
// exit fa sempre flush dei buffer


Revision [3373]

Edited on 2017-11-24 14:49:42 by EmilioCoppa
Additions:
printf("AAAA"); // printf usa gli stream stdio e flush del buffer potrebbe non essere immediato se la stringa non contiene il carattere newline
// fflush(stdout); // provare a decommentare, forza il flushing dei buffer stdio
printf("BBBB"); // printf usa gli stream stdio e flush del buffer potrebbe non essere immediato se la stringa non contiene il carattere newline
exit(EXIT_SUCCESS); // provare a sostituire con _exit: exit fa flush, _exit non lo fa
// exit fa sempre flush dei buffer
Deletions:
printf("AAAA");
// fflush(stdout); // provare a decommentare
printf("BBBB");
exit(EXIT_SUCCESS); // provare a sostituire con _exit


Revision [3372]

Edited on 2017-11-24 14:44:50 by EmilioCoppa
Additions:
return EXIT_SUCCESS; // eseguita indirettamente: exit(EXIT_SUCCESS)


Revision [3371]

Edited on 2017-11-24 14:42:12 by EmilioCoppa
Additions:
if (res != 0) { // man atexit: The atexit() function returns the value 0 if successful; otherwise it returns a nonzero value.
Deletions:
if (res != 0) {


Revision [3370]

Edited on 2017-11-24 14:36:13 by EmilioCoppa
Additions:
int res = atexit(bye); // quando verra' invocata exit
Deletions:
int res = atexit(bye); // quanto verra' invocata exit


Revision [3369]

Edited on 2017-11-24 14:33:17 by EmilioCoppa
Additions:
printf("[genitore] x = %d, &x = %p \n", x, &x);
printf("[figlio] x = %d, &x = %p (prima)\n", x, &x);
printf("[figlio] x = %d, &x = %p (dopo)\n", x, &x);
printf("[genitore] x = %d, &x = %p \n", x, &x);
}%%
Deletions:
printf("[genitore] x = %d\n", x);
printf("[figlio] x = %d (prima)\n", x);
printf("[figlio] x = %d (dopo)\n", x);
printf("[genitore] x = %d\n", x);


Revision [3367]

Edited on 2017-11-24 12:42:51 by CamilDemetrescu
Additions:
sa.sa_handler = SIG_IGN; // usare SIG_DFL per ripristinare l'handler di default
Deletions:
sa.sa_handler = SIG_IGN;


Revision [3366]

Edited on 2017-11-24 12:31:41 by CamilDemetrescu
Additions:
printf("[figlio] x = %d (dopo)\n", x);
Deletions:
printf("[foglio] x = %d (dopo)\n", x);


Revision [3365]

Edited on 2017-11-23 18:24:36 by EmilioCoppa
Additions:
while(1);
while(1);
while(1);
Deletions:
while(1) sleep(1);
while(1) sleep(1);
while(1) sleep(1);


Revision [3364]

Edited on 2017-11-23 18:12:17 by EmilioCoppa
Additions:
while(1) sleep(1);
while(1) sleep(1);
while(1) sleep(1);
Deletions:
sleep(240);
sleep(240);
sleep(240);


Revision [3363]

Edited on 2017-11-23 18:00:21 by EmilioCoppa
Additions:
printf("figlio e' terminato\n");
_exit(EXIT_SUCCESS);
Deletions:
printf("Child e' terminato\n");


Revision [3356]

Edited on 2017-11-23 17:39:56 by EmilioCoppa
Additions:
printf("Genitore termina: sleep eseguita interamente per %d secondi\n", s);
Deletions:
printf("Genitore termina: sleep eseguita interamente per %d secondi\n", res);


Revision [3355]

Edited on 2017-11-23 17:39:16 by EmilioCoppa
Additions:
printf("Miracolo!\n"); // mai eseguito
=== Esempio: gestore segnale installato con ##sigaction##===
%%(c;sigaction-1.c)
struct sigaction sa = {0};
sa.sa_handler = myhandler;
int res = sigaction(SIGINT, &sa, NULL);
=== Esempio: ignorare un segnale (##sigaction##)===
%%(c;sigaction-2.c)
struct sigaction sa = {0};
sa.sa_handler = SIG_IGN;
int res = sigaction(SIGINT, &sa, NULL);
=== Esempio: gestore SIGCHLD, interruzione system call===
%%(c;sigaction-3.c)
printf("Child e' terminato\n");
struct sigaction sa = {0};
sa.sa_handler = myhandler;
int res = sigaction(SIGCHLD, &sa, NULL);
pid_t pid = fork();
int s = 30;
res = sleep(s); // genitore potrebbe fare qualcosa di piu' utile
// in questo esempio invoca una system call
if (res < s)
printf("Genitore termina: sleep terminata prematuramente dopo %d secondi\n", s - res);
else
printf("Genitore termina: sleep eseguita interamente per %d secondi\n", res);
Deletions:
printf("Miracolo!\n");


Revision [3353]

Edited on 2017-11-23 17:26:21 by EmilioCoppa
Additions:
=== Esempio: gestore segnale installato con ##signal##===
La funzione POSIX ##signal## รจ deprecata e non andrebbe usata.
%%(c;signal.c)
void myhandler(int signo) {
printf("Ricevuto segnale: %d\n", signo);
signal(SIGINT, myhandler);
sleep(240);


Revision [3352]

Edited on 2017-11-23 16:52:17 by EmilioCoppa
Additions:
=== Esempio invio segnale: uso funzione POSIX ##kill## ===
%%(c;kamikaze.c)
#include
#include
printf("kamikaze mode\n");
kill(getpid(), SIGKILL);
printf("Miracolo!\n");
return 0;


Revision [3351]

Edited on 2017-11-23 16:14:03 by EmilioCoppa
Additions:
Modificare la versione 3 implementando il comando interno ##mypwd##. Per ogni comando inserito dall'utente, se viene indicato il comando ##mypwd##, la shell deve eseguire una funzione interna che stampa in standard output il valore della variabile d'ambiente ##PWD##.
Deletions:
Modificare la versione 3 implementando il comando interno ##mypwd##. Per ogni comando inserito dall'utente, se viene indicato il comando ##mypwd## la shell deve eseguire una funzione interna che stampa in standard output il valore della variabile d'ambiente ##PWD##.


Revision [3350]

Edited on 2017-11-23 16:13:27 by EmilioCoppa
Additions:
== Versione 4 (esercizio per casa) ==
Modificare la versione 3 implementando il comando interno ##mypwd##. Per ogni comando inserito dall'utente, se viene indicato il comando ##mypwd## la shell deve eseguire una funzione interna che stampa in standard output il valore della variabile d'ambiente ##PWD##.


Revision [3349]

Edited on 2017-11-23 16:06:33 by EmilioCoppa
Additions:
Modificare la versione 2 in modo da ricevere il comando da eseguire attraverso lo stream di standard input, utilizzando la funzione ##scanf##. Alla terminazione del comando eseguito, la shell deve tornare a richiedere nuovamente un nuovo comando all'utente.
Deletions:
Modificare la versione 2 in modo da ricevere il comando da eseguire da standard input, utilizzando la funzione ##scanf##. Alla terminazione del comando eseguito, la shell deve tornare a richiedere nuovamente un nuovo comando all'utente.


Revision [3348]

The oldest known version of this page was created on 2017-11-23 16:05:42 by EmilioCoppa
Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by WikkaWiki
Page was generated in 0.1173 seconds