Buongiorno a tutti!
Sto cercando di capire l'output di un pezzo di codice che utilizza le librerie POSIX e in particolare le system call execl e system. Da quanto ho capito la system permette di eseguire su shell comandi impartiti attraverso una stringa (almeno per quanto ho visto); non è bloccante, ossia il codice prosegue dopo la chiamata a funzione. L'exec invece va a sostituire il processo corrente con un nuovo processo (con stesso PID..) ed è bloccante, per cui il codice successivo alla chiamata dell'exec non viene eseguito.


Fatta questa premessa, ecco il codice:

char str[100];
  int i;
  fork();
  for (i=0; i<2; i++){
    if (fork()!=0) {
      sprintf (str, "echo system with i=%d", i);
      system (str);
    } else {
      sprintf (str, "exec with i=%d", i);
      execlp ("echo", "myPgrm", str, NULL);
    }
  }

Io mi aspetto che venga eseguito il seguente output:

system with i=0
exec with i=0
system with i=1
exec with i=1

poichè essendo l'exec bloccante il primo processo figlio viene sostituito da str e NON eseguirà una ulteriore fork().

L'output corretto è invece

system with i=0
exec with i=0
system with i=1
exec with i=1
system with i=0
exec with i=0
system with i=1
exec with i=1

escluso l'ordine che ovviamente è "casuale", come mai è questo l'output? Grazie mille! 

chiesto 24 Lug '15, 17:25

Strcmp_01's gravatar image

Strcmp_01
452711


L'output che hai previsto tu considera solo la fork presente nel ciclo for, mentre ne viene eseguita un'altra all'inizio del programma, duplicando il tutto.

coll. permanente

ha risposto 24 Lug '15, 18:16

dslul's gravatar image

dslul
9632416

Grazie della risposta! Non posso credere di non averla notata..

(24 Lug '15, 18:18) Strcmp_01 Strcmp_01's gravatar image
La tua risposta
abilita/disabilita anteprima

Segui questa domanda

Via email:

Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui

Via RSS:

Risposte

Risposte e commenti

Basi di markdown

  • *corsivo* o __corsivo__
  • **grassetto** o __grassetto__
  • collegamento:[testo](http://url.com/ "titolo")
  • immagine?![alt testo](/path/img.jpg "titolo")
  • elenco numerato: 1. Foo 2. Bar
  • per aggiungere un'interruzione di riga, aggiungi due spazi a fine riga e premi «Invio»
  • è supportato anche semplice HTML

Tag:

×13

domanda posta: 24 Lug '15, 17:25

domanda visualizzata: 1,088 volte

ultimo aggiornamento: 24 Lug '15, 18:18

Chiedi è un servizio di supporto gestito da Ubuntu-it. Contattaci!

powered by OSQAPostgreSQL database
Ubuntu e Canonical sono marchi registrati da Canonical Ltd.