Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Sistemi Operativi, 9 CFU => Topic started by: Il Capitano on 24-05-2012, 18:09:18



Title: Esercizio (stralcio di compito)
Post by: Il Capitano on 24-05-2012, 18:09:18
Salve.
Ho qualche dubbio sul seguente esercizio:

"Supponiamo di eseguire la seguente sequenza di comandi su una shell UNIX all’interno di una cartella vuota:

$ echo "ciao" > testo.txt
$ chmod g-r testo.txt
$ cat testo.txt 2> /dev/null && echo verde || echo rosso

Come output ottengo :

ciao
verde

Non ho ben capito l'ultima riga di comandi.Con la prima effettuo il redirezionamento dell'output sul file testo.txt.La seconda modifica i permessi di accesso del file.
La terza visualizza il contenuto del file e qui mi spiego il primo output "ciao",ma non riesco a capire perchè poi restituisce verde.Con quale ordine vengono eseguiti gli || e gli && ?

Grazie.


Title: Re:Esercizio (stralcio di compito)
Post by: Matto1790 on 24-05-2012, 18:27:37
Mi soffermo su ciò che non hai capito : allora dalle slide del professore la seconda condizione di un && viene eseguita solo se la prima risulta "true" ovvero non da errori. Quindi vedendo il testo in questa maniera :
cat testo.txt 2> /dev/null && (echo verde || echo rosso) capisci meglio che la seconda condizione è fatta da : "echo verde || echo rosso"; di questi viene eseguito il secondo solo se il primo da errore o risulta "false" ma non è questo il caso per cui risulta :
ciao
verde

Spero che ti sia più chiaro ora anche se non credo di essermi spiegato al meglio  .penso


Title: Re:Esercizio (stralcio di compito)
Post by: Il Capitano on 25-05-2012, 08:47:09
Mi soffermo su ciò che non hai capito : allora dalle slide del professore la seconda condizione di un && viene eseguita solo se la prima risulta "true" ovvero non da errori. Quindi vedendo il testo in questa maniera :
cat testo.txt 2> /dev/null && (echo verde || echo rosso) capisci meglio che la seconda condizione è fatta da : "echo verde || echo rosso"; di questi viene eseguito il secondo solo se il primo da errore o risulta "false" ma non è questo il caso per cui risulta :
ciao
verde

Spero che ti sia più chiaro ora anche se non credo di essermi spiegato al meglio  .penso

Ok con le parentesi è un po più chiaro.
Grazie  .smile



Title: Re:Esercizio (stralcio di compito)
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 25-05-2012, 09:40:29
Le parentesi sono state inserite male.

I comandi vengono eseguiti (o letti) nell'ordine da sinistra a destra.

Se proprio si volesse includere le parentesi per evidenziare l'ordine, si dovrebbe sfruttare l'associatività a sinistra, ovvero:

(cat testo.txt 2> /dev/null && echo verde) || echo rosso

E così, se il file test.txt esiste vedresti "verde" dopo il contenuto del file, ma se non esistesse, vedresti "rosso".

Gli operatori && e || sono cortocircuitati, proprio come in C e in Java.


Title: Re:Esercizio (stralcio di compito)
Post by: Il Capitano on 25-05-2012, 09:48:01
Le parentesi sono state inserite male.

I comandi vengono eseguiti (o letti) nell'ordine da sinistra a destra.

Se proprio si volesse includere le parentesi per evidenziare l'ordine, si dovrebbe sfruttare l'associatività a sinistra, ovvero:

(cat testo.txt 2> /dev/null && echo verde) || echo rosso

E così, se il file test.txt esiste vedresti "verde" dopo il contenuto del file, ma se non esistesse, vedresti "rosso".

Gli operatori && e || sono cortocircuitati, proprio come in C e in Java.

A perfetto.Quindi se il file non esistesse ,in output avrei solo "rosso"?


Title: Re:Esercizio (stralcio di compito)
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 25-05-2012, 09:53:51
Esattamente.

Comunque, materie di questo tipo si studiano male se non le si pratica.
La cosa migliore che puoi fare è di provare tu stesso i comandi, per capire come funzionano le cose .smile.


Title: Re:Esercizio (stralcio di compito)
Post by: Il Capitano on 25-05-2012, 09:56:32
Esattamente.

Comunque, materie di questo tipo si studiano male se non le si pratica.
La cosa migliore che puoi fare è di provare tu stesso i comandi, per capire come funzionano le cose .smile.

Si si hai perfettamente ragione ho appena provato ,era solo per capire se avevo compreso il tuo ragionamento.
Grazie 1000  .smile


Title: Re:Esercizio (stralcio di compito)
Post by: Matto1790 on 25-05-2012, 14:01:23
Le parentesi sono state inserite male.

Si hai ragione sorry  .arrossisco


Title: Re:Esercizio (stralcio di compito)
Post by: Il Capitano on 25-05-2012, 16:58:18
Approfitto della vostra disponibilità per cercare di chiarire dei dubbi sul seguente esercizio

Supponiamo di avere 3 processi che condividono una variabile x e che i loro pseudo-codici siano i seguenti:

P1: wait(S)
      x=x-2
      signal(T)
      wait(S)
      x=x-1
      signal(T)

P2: wait(R)
      x=x+2   
      signal(T)
      wait(R)

P3: wait(T)
      if (x<0)
      signal(R)
      wait(T)
      print(x)

Determinare l’output del processo P3 assumendo che il valore iniziale di x  è 1 e che i 3 semafori abbiano i seguenti valori iniziali: S=1, R=0, T=0.

Non sapendo cosa facciano wait e signal non sto capendo bene come muovermi  .penso


Title: Re:Esercizio (stralcio di compito)
Post by: Mario Di Raimondo on 25-05-2012, 21:19:58
Non sapendo cosa facciano wait e signal non sto capendo bene come muovermi  .penso

Una leggenda metropolitana afferma che studiare la teoria aiuti nel risolvere i relativi esercizi...


Title: Re:Esercizio (stralcio di compito)
Post by: Matto1790 on 25-05-2012, 23:55:46
Non sapendo cosa facciano wait e signal non sto capendo bene come muovermi  .penso

Una leggenda metropolitana afferma che studiare la teoria aiuti nel risolvere i relativi esercizi...

Direttamente dalle slide SO-02 pagina 23 : "operazioni: down e up (detti anche wait e signal);"
Penso che sapendo questo arriverai a capire da solo cosa facciano wait e signal e che valore avrà "x" alla fine  :-ciao


Title: Re:Esercizio (stralcio di compito)
Post by: Il Capitano on 26-05-2012, 08:32:07
Non sapendo cosa facciano wait e signal non sto capendo bene come muovermi  .penso

Una leggenda metropolitana afferma che studiare la teoria aiuti nel risolvere i relativi esercizi...

Direttamente dalle slide SO-02 pagina 23 : "operazioni: down e up (detti anche wait e signal);"
Penso che sapendo questo arriverai a capire da solo cosa facciano wait e signal e che valore avrà "x" alla fine  :-ciao

Sei stato molto gentile.Il fatto è che io studio lezioni+slides+libro e poi riunisco tutto in un quaderno scritto da me, ma erroneamente ho pensato di poter tralasciare i "sinonimi" di down e up.Quindi studiando sempre nel quaderno non me li sono mai ritrovati e mi suonavano nuovi.Grazie ancora


Title: Re:Esercizio (stralcio di compito)
Post by: milos224 on 28-05-2012, 09:52:38
Non sapendo cosa facciano wait e signal non sto capendo bene come muovermi  .penso

Una leggenda metropolitana afferma che studiare la teoria aiuti nel risolvere i relativi esercizi...

Direttamente dalle slide SO-02 pagina 23 : "operazioni: down e up (detti anche wait e signal);"
Penso che sapendo questo arriverai a capire da solo cosa facciano wait e signal e che valore avrà "x" alla fine  :-ciao
Alla fine l'output qual'è? 0?


Title: Re:Esercizio (stralcio di compito)
Post by: StephCT on 28-05-2012, 10:06:36
http://forum.sdai.unict.it/index.php?topic=12907.0

qua viene fatta una discussione sullo stesso esercizio e si spiega come funziona...


Title: Re:Esercizio (stralcio di compito)
Post by: milos224 on 28-05-2012, 10:20:02
http://forum.sdai.unict.it/index.php?topic=12907.0

qua viene fatta una discussione sullo stesso esercizio e si spiega come funziona...
Ok, ho preso la soluzione.

X=1 S=1 R=0 T=0

L'unico processo che può partire è P1, fa una wait su S, ora le variabili valgono
X=1 S=0 R=0 T=0

P1: x=x-2  //Ora x vale -1
signal(T) //Ora T vale 1
wait(S)  //Si blocca aspettando che S torni 1

X=-1 S=0 R=0 T=1
L'unico processo che può partire è P3, fa una wait su T:
X=-1 S=0 R=0 T=0

P3:
 if (x<0) signal(R)  //Verificato R=1
wait(T) //T è zero si blocca aspettando che T torni 1

Ora l'unico processo che può partire è P2, fa una wait su R:
X=-1 S=0 R=0 T=0
P2:
x=x+2 //X=1
signal(T) // T=1
wait(R) //Si blocca

X=1 S=0 R=0 T=1
P3 è l'unico processo ad aspettare su T, quindi può proseguire:
P3:
print(x)

Output 1

Non mi è chiaro l'ultimo passaggio..P3 è l'unico processo che aspetta su T, ma poi c'è la condizione:
 if (x<0) signal(R)  //Non Verificato
wait(T) //T è zero e non si dovrebbe bloccare? Come fa a stampare 1?


Title: Re:Esercizio (stralcio di compito)
Post by: StephCT on 28-05-2012, 11:20:01
il processo P3 alla fine riparte da print(x) direttamente, non dall'inizio... almeno così dovrebbe essere... ogni processo dovrebbe ripartire dopo l'ultima wait.


Title: Re:Esercizio (stralcio di compito)
Post by: Il Capitano on 28-05-2012, 13:29:10
il processo P3 alla fine riparte da print(x) direttamente, non dall'inizio... almeno così dovrebbe essere... ogni processo dovrebbe ripartire dopo l'ultima wait.

Esattamente.


Title: Re:Esercizio (stralcio di compito)
Post by: milos224 on 28-05-2012, 14:13:51
il processo P3 alla fine riparte da print(x) direttamente, non dall'inizio... almeno così dovrebbe essere... ogni processo dovrebbe ripartire dopo l'ultima wait.

Esattamente.
Perciò quando un processo ha finito tutti i suoi passaggi non si deve mai più prendere in considerazione no?


Title: Re:Esercizio (stralcio di compito)
Post by: milos224 on 28-05-2012, 23:08:00
il processo P3 alla fine riparte da print(x) direttamente, non dall'inizio... almeno così dovrebbe essere... ogni processo dovrebbe ripartire dopo l'ultima wait.

Esattamente.
Perciò quando un processo ha finito tutti i suoi passaggi non si deve mai più prendere in considerazione no?
Nessuno raga?


Title: Re:Esercizio (stralcio di compito)
Post by: Andrea2990 on 29-05-2012, 09:26:05
L'esercizio ha uno scopo, trovare l'output di P3. Una volta trovato l'output, non si deve fare più nulla. Ovviamente, dopo che un processo è stato eseguito per intero, esso termina, quindi non ha senso riprenderlo in considerazione. Come dice StephCT, inoltre, bisogna riprendere dal punto in cui ci si è fermati, non ricominciare da capo. Buono studio!


Title: Re:Esercizio (stralcio di compito)
Post by: milos224 on 29-05-2012, 09:28:15
L'esercizio ha uno scopo, trovare l'output di P3. Una volta trovato l'output, non si deve fare più nulla. Ovviamente, dopo che un processo è stato eseguito per intero, esso termina, quindi non ha senso riprenderlo in considerazione. Come dice StephCT, inoltre, bisogna riprendere dal punto in cui ci si è fermati, non ricominciare da capo. Buono studio!
Grazie mille!


Title: Re:Esercizio (stralcio di compito)
Post by: Daréios89 on 29-05-2012, 11:47:12
Le parentesi sono state inserite male.

I comandi vengono eseguiti (o letti) nell'ordine da sinistra a destra.

Se proprio si volesse includere le parentesi per evidenziare l'ordine, si dovrebbe sfruttare l'associatività a sinistra, ovvero:

(cat testo.txt 2> /dev/null && echo verde) || echo rosso

E così, se il file test.txt esiste vedresti "verde" dopo il contenuto del file, ma se non esistesse, vedresti "rosso".

Gli operatori && e || sono cortocircuitati, proprio come in C e in Java.

Scusa ma qui non dovrei leggere tutto?

Cioè siccome il file esiste allora la condizione dell' operatore AND è soddisfatta, ma in ogni caso avendo poi un OR non dovrei comunque leggere:

ciao
verde
rosso

?

Forse perchè viene eseguito se e solo se l'exit status del primo primo comando è diverso da 0.


Title: Re:Esercizio (stralcio di compito)
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 29-05-2012, 12:08:29
Cioè siccome il file esiste allora la condizione dell' operatore AND è soddisfatta, ma in ogni caso avendo poi un OR non dovrei comunque leggere:

ciao
verde
rosso

?
No.

(cat testo.txt 2> /dev/null && echo verde) || echo rosso
\___ vero: file esiste ___/
\_______ vero: echo restituisce 0 _______/
\________vero: indipendentemente da "echo rosso" _____/


Nell'ultima riga, non a caso dico "indipendentemente", cioè "senza che ci sia bisogno di eseguire" echo rosso.
Poiché \fs{3}\text{vero}\vee x=\text{vero},\;\forall x\in\{\text{vero}, \text{falso}\}.
E siccome questi operatori sono cortocircuitati, il "senza bisogno di eseguire" si traduce in "non sarà eseguito perché ininfluente".


Title: Re:Esercizio (stralcio di compito)
Post by: Matto1790 on 29-05-2012, 14:21:26
Le parentesi sono state inserite male.

I comandi vengono eseguiti (o letti) nell'ordine da sinistra a destra.

Se proprio si volesse includere le parentesi per evidenziare l'ordine, si dovrebbe sfruttare l'associatività a sinistra, ovvero:

(cat testo.txt 2> /dev/null && echo verde) || echo rosso

E così, se il file test.txt esiste vedresti "verde" dopo il contenuto del file, ma se non esistesse, vedresti "rosso".

Gli operatori && e || sono cortocircuitati, proprio come in C e in Java.

Scusa ma qui non dovrei leggere tutto?


Apparte che come già detto sono operatori cortocircuitati, poi nelle slide è comunque spiegato che per quanto riguarda l'operatore "||" la sua seconda condizione viene valutata se e solo se la prima risulti false.  :-)|

P.s. slide 55 "SO-lab-unix-shell-video"

Forse perchè viene eseguito se e solo se l'exit status del primo primo comando è diverso da 0.

Togli il forse, è corretto  :-OK


Title: Re:Esercizio (stralcio di compito)
Post by: Daréios89 on 29-05-2012, 17:41:31
 :yoh


Title: Re:Esercizio (stralcio di compito)
Post by: milos224 on 18-07-2012, 16:09:59
scusate ma
$ cat testo.txt 2> /dev/null && echo verde || echo rosso

visualizza il contenuto del file testo ma non ho capito il 2> /dev/null, ovvero ridireziona lo standard error su null..
praticamente dato che non abbiamo errori non scarta nulla?


Title: Re:Esercizio (stralcio di compito)
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 18-07-2012, 16:50:59
scusate ma
$ cat testo.txt 2> /dev/null && echo verde || echo rosso

visualizza il contenuto del file testo ma non ho capito il 2> /dev/null, ovvero ridireziona lo standard error su null..
praticamente dato che non abbiamo errori non scarta nulla?
Più precisamente, scarta la stringa vuota, che è la stringa restituita su standard error dall'esecuzione del comando .sisi.


Title: Re:Esercizio (stralcio di compito)
Post by: milos224 on 18-07-2012, 17:14:12
scusate ma
$ cat testo.txt 2> /dev/null && echo verde || echo rosso

visualizza il contenuto del file testo ma non ho capito il 2> /dev/null, ovvero ridireziona lo standard error su null..
praticamente dato che non abbiamo errori non scarta nulla?
Più precisamente, scarta la stringa vuota, che è la stringa restituita su standard error dall'esecuzione del comando .sisi.
Molto chiaro come sempre .sisi