TD

Interruptions et Gestion des Processus sous Linux

 

Utilisation du & et du CTRL+Z, des commandes fg, bg, jobs et ps

Exemple

Exercice à faire

  • Lancer la commande « sleep 2000 » en arrière-plan (&)
  • Lancer la commande « sleep 1000 » en arrière-plan (&)
  • Visualiser les processus en arrière-plan (background) avec la commande « jobs »
  • Visualiser tous les processus en cours avec la commande « ps »
  • Ramener la commande « sleep 2000 » en avant-plan (foreground) avec la commande « fg »
  • La remettre en arrière-plan avec un CTRL+Z et vérifier avec la commande « jobs »
  • Lancer la commande « sleep 3000 » en arrière-plan
  • Ramener la commande « sleep 1000 » en avant-plan et l'interrompre par CTRL+C
  • Stopper le processus « sleep 2000 » à l'aide de la commande « kill »
  • Tester différents signaux (Cf. kill -l) sur une commande « sleep n »
  • Récupérer les programmes PS_EXEC-.C et PS_FORK-.C qui ont été préparés sous Windows (fin de ligne en CR+LF)

  • Compiler avec la commande make (faire attention aux extensions C et C++)
  • Expliquer le fonctionnement de ces programmes

Instructions

  • Expliquer le fonctionnement des programmes PS_EXEC-.C et PS_FORK-.C suivants

  • Commenter le fonctionnement de l'appel système execl


Programme PS_EXEC-.C

/*
 * ######
 * ## ps_exec.c
 * ## ~~~~~~~~~
 * ## 04.02.1995: Creation TL
 * ## 07.05.2018:
 * ##
 * ## Au lancement de ce programme, il est possible de passer
 * ## des arguments.
 * ##
 * ## Verifier ce qui est obtenu avec:
 * ##
 * ## ./ps_exec un deux trois
 * ##
 * ## Le 1er argument (un) est-il le numero 0 ou 1 de argv ?
 * ## Comment recupere-ton le nom de la commande ?
 * ## Obtient-on le filename et le pathname de la commande ?
 * ######
 */


#include <stdio.h>
#include <stdlib.h>

#include <sys/types.h>
#include <unistd.h>

int main(argcargv)
  
int  argcchar **argv;
{
  
printf" \n" );
  
printf" ps_exec> Debut execution\n" );
  
printf" ps_exec> Numero PID   = %d\n"getpid() );
  
printf" ps_exec> Nb arguments = %d\n"argc );

  
int KP;
  for ( 
KP 0KP argcKP++ ) {
    
printf" ps_exec>    argv[ %d ] = %s\n"KPargvKP ] );
  }

  
printf(" \n ");
  exit( 
);
}
/*--  fin  ps_exec.c  --*/

Programme PS_FORK-.C

/*
 * #######
 * ## ps_fork.c
 * ## =========
 * ## 04.02.1995: Creation TL
 * ## 07.05.2018:
 * ##
 * ## Ce programme se divise en 2 processus par FORK
 * ##
 * ######
 */

#include <stdio.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>


int main()
{
  
int  pidppidfpidkpidw;

  
printf" \n" );

  
pidp getpid();
  
printf" ps_fork   > Debut execution : pid = %d\n"pidp );

  
/*
   * Creation du processus fils par FORK
   * Les 2 processsus executent les memes instructions
   * Il sdifferent par leutr PID et la valeur retournee par le fork
   * et stokee dans la variable pidp
   */

  
pidk fork();

  if ( 
pidk == -) {
    
printf" ps_fork   > Creation de processus impossible\n" );
    exit(
1);
  }

  
printf" ps_fork   > Code execute par les 2 ! mais : getpid() = %d\n "getpid());

  if ( 
pidk == ) {

    
/* code execute par le processus FILS */
    
printf" ps_fork(f)> Valeur retournee par le fork = %d\n"pidk );

    
pidf=getpid();
    
printf" ps_fork(f)> PID( avant exec ) = %d\n"pidf );

    
sleep(5);
    (
voidexecl("ps_exec""liste des arguments"NULL );

    
printf" ps_fork(f)> Erreur ps_exec\n" );
  } else {

    
/* code execute par le processus PERE */
    
printf" PS_FORK(p)> Valeur retournee par le fork = %d\n"pidk );

    
/* attente de fin d'execution du (d'un) fils */
    
pidw wait);
    
printf" PS_FORK(p)> PID du fils se terminant = %d\n"pidw );
  }

  
printf" ps_fork   > Fin Processus : %d\n"getpid() );
  exit( 
);
}
/*--  fin  ps_fork.c  --*/

Exemple