Domanda SystemCall C

Stato
Discussione chiusa ad ulteriori risposte.

N0body

Utente Bronze
15 Novembre 2016
17
5
1
35
Ultima modifica:
Buona sera,
Ho delle difficoltà riguardo questo programma.
Non riesco a capire perché quando eseguo mi stampa prima il terzo figlio e poi il resto nel giusto modo,e soprattutto perché alla stampa dei pid figli mi escono altri numeri.
Grazio tutte le persone per l'interessamento e il tempo dedicatomi.
Ps. Scusate per la mancata indentation.
  1. [HASHTAG]#include[/HASHTAG] <stdlib.h>
  2. [HASHTAG]#include[/HASHTAG] <stdio.h>
  3. [HASHTAG]#include[/HASHTAG] <unistd.h>
  4. [HASHTAG]#include[/HASHTAG] <sys/wait.h>

  5. int main(){
  6. int pid_1,pid_2,pid_3;
  7. pid_1=fork();
  8. int p1=0,p2=0,p3=0;
  9. if(pid_1 < 0){
  10. printf("Creazione fallita\n");
  11. exit(-1);
  12. }else if(pid_1 == 0){
  13. printf("Pid primo figlio %d\n",getpid());
  14. printf("La differenza e' %d\n",getpid()-getppid());
  15. p1=getpid();
  16. exit(0);
  17. }
  18. else if(pid_1>0){
  19. wait(NULL);
  20. pid_2=fork();
  21. if(pid_2 <0){
  22. printf("errore\n");
  23. exit(0);
  24. }else if(pid_2 == 0){
  25. p2=getpid();
  26. execlp("/bin/echo","echo","\nsono il secondo figlio",NULL);
  27. exit(0);
  28. }else if(pid_2>0){
  29. wait(NULL);
  30. pid_3 = fork();
  31. if(pid_3<0){
  32. printf("Errore\n");
  33. exit(0);
  34. }else if (pid_3 == 0){
  35. printf("Pid terzo figlio %d\n",getpid());
  36. execlp("/bin/ls","ls",NULL);
  37. p3=getpid();
  38. exit(0);
  39. }else{
  40. wait(NULL);
  41. printf("Pid padre %d\n",getppid());
  42. printf("I figli sono %d %d %d\n",pid_1,pid_2,pid_3);
  43. exit(0);
  44. }
  45. }
  46. }
  47. return 0;
  48. }

Aggiornamento: problema risolto e funzionante.
 
Questa istruzione è sbagliata:
C:
printf("I figli sono %d %d %d\n",p1,p2,p3);
Perché gli assegnamenti che hai fatto alle variabili p1, p2 e p3 erano su aree di memoria differenti, ogni nuovo processo ha il proprio spazio di indirizzamento. I valori che vedi a schermo variano perché le variabili non sono inizializzate, ma se le inizializzi subito a 0, vedrai che non cambiano.

L'ordine delle print a me sempra ok. Se a te sembra sbagliato prova a dirci cosa ti aspettavi di vedere (e perché ti aspettavi di vederlo così) e cosa ottieni.
 
Ti ringrazio per la risposta veloce,e la gentilezza.
Allego uno screen,mi aspetto il pid dei figli e l'ordine come l'ho scritto nel programma ovvero primo figlio,secondo figlio e terzo figlio. Purtroppo sono ancora inesperto su questo tipo di argomento e sto cercando di approfondire,grazie per la pazienza.
http://imgur.com/a/HR85R
 
Ok, si... hai ragione. Togli tutti i wait(NULL) che hai e poi mettine uno sopra ogni fork(), l'unica fork che non deve avere sopra il wait è la prima visto che ovviamente non deve aspettare nessuno.
 
http://imgur.com/a/Bt3WO
Rimane in attesa e ripete una ls,come puoi vedere dallo screen. E sto provando ad inserire anche un echo sul secondo figlio,non capisco perchè rimane in attesa nonostante le execlp fanno terminare i figli e c'è un exit(0) sul padre alla fine.
 
Serve un wait anche dentro l'else, prima che il padre stampi:
  1. padre crea figlio 1
  2. figlio 1 stampa ed esce
  3. padre aspetta e crea figlio 2
  4. figlio 2 stampa ed esce
  5. padre aspetta e crea figlio 3
  6. figlio 3 stampa ed esce
  7. padre aspetta, stampa ed esce
Senza quest'ultimo wait il padre non aspetta al punto 7, quindi non puoi predire chi stampa per prima. Le wait prima delle fork servono per dire "aspetta che muore un figlio prima di creare il successivo" (almeno i due non si pestano i piedi su chi deve stampare prima), mentre l'ultimo wait serve per dire "aspetta che muore anche l'ultimo figlio prima di eseguire la print del padre".

Di ls ce n'è solo una 2, fatta dal terzo figlio. Non capisco cosa intendi con "ripete una ls", ma ora dovrebbe essere a posto.
 
Ti ringrazio infinitamente per la pazienza ed il tempo dedicatomi. Ora modifico il codice nel post di creazione e inserisco il sorgente funzionante.
 
Stato
Discussione chiusa ad ulteriori risposte.