exercice 1#

1ere question#

1ere maniere#

int main(){
  int ret1;
  ret1 = fork();
  if (fork() == 0){// on est donc dans le fils 1
    if (fork() == 0){//on est dans le fils 2
      return 0;
    }
    wait(NULL);
    return 0;
  }
  wait(NULL);
  return 0;
}

2eme maniere#

deux types de notation: == 0 ou > 0`

int main(){
  int ret1;
  ret1 = fork();
  if (fork() > 0){
  // pere: car fork renvoie 
    wait(NULL);
    return 0;
  } else { // processus fils 1
    if (fork() > 0){
      wait(NULL);
      return 0;
    } else{
      wait(NULL);
      return 0;
    }
  }
}

quand processus fils se termine il passe a letat de zombie => ses ressources ne sont pas libres => wait() permets de faire disparaitre le fils

2eme question#

3)#

int main(){
  for (int i=0;i<3;i++){
    if (fork() > 0){
      wait(NULL);
      break;
    }
  }
  return 0;
}

exercice 2#

int pid1 = fork();
if(pid1 == 0) { // code exécuté par le fils
  return 0;
}
int pid2 = fork();
if(pid2 == 0) { // code exécuté par le fils
  return 0;
waitpid(pid1,NULL,0); //attente fils1
waitpid(pid2,NULL,0); //attente fils2
}
// code exécuté par le père
int main(){
  int pid1 = fork();
  if (pid1 == 0)
    return 0;
  int pid2 = fork();
  if (pid2 == 0){
    int pid3 = fork();
    if (pid3 == 0)
      return 0;
    int pid4 = fork();
    waitpid(pid3,NULL,0);
    waitpid(pid4,NULL,0);
    return 0;
  }
  waitpid(pid1,NULL,0);
  waitpid(pid2,NULL,0);
  
}

partie 2#

a)#

int pid[4];
for (int i = 0 ; i < 4 ; i++){
  pid[i] = fork();
  if (pid[0] == 0)
    return 0;
}

exercice 3#

int main(void) {
  if( fork() > 0 ) {
      wait(NULL);
    }
    else {
      sleep(5);
  }
return 0;
}

1er programme#

le fils dors 5secondes

2eme programme#

le pere et le fils dorment 5 secondes (en meme temps)

3eme programme#

le pere attends que le fils ait finis de dormir (avant de dormir lui aussi)=>donc tout le monde dors

4eme programme#

on fait sleep(5) sans faire de verification si pere ou fils: