Partiel de Systèmes - M1 - 2008-2009



Nom:
Prénom:
N^ étudiant:



Exercice 1


\begin{alterqcm}[lq=100mm,alea,pre=true,bonus=1,malus={0.5}]%,correction]
\AQque...
...{prévenir qu'un fils a terminé},
{stopper le leader de session}
}
\end{alterqcm}

Exercice 2

Écrire une fonction de prototype int tube(int n,char **cmd[]); permettant d'exécuter en concurrence les commandes (et leurs arguments) contenues dans le tableau cmd. Chaque commande doît écrire dans un tube dont l'autre extrémité est lue par la commande suivante (sauf pour la première -respectivement dernière- commande qui lit -resp. écrit- sur l'entrée -resp. la sortie- standard).

Rappel: un tube anonyme est obtenu par appel à int pipe(int d[2]);d est le tableau des deux descripteurs de lecture et d'écriture dans le tube ([0] pour la lecture et [1] pour l'écriture).

Exercice 3

Écrire un programme dont l'exécution conduira à la création d'un processus zombie.

Exercice 4

Soit les deux fonctions suivantes:
void total(int s) {
  	int total=0, depot;
  	for (int i=0; i<NCLIENTS; i++) {
    		lseek(comptes,i*sizeof(int),SEEK_SET);
     read(comptes,&depot,sizeof(depot));
    		total += depot;
  	}
  	printf("Nous avons: %d euros sur nos comptes de dépôt\n",total);
}
void virement(int s) {
  	int depot1, depot2;
	
  	// lecture du i-ième entier du fichier
  	lseek(comptes,client1*sizeof(int),SEEK_SET);
  	read(comptes,&depot1,sizeof(int));
  	// lecture du i-ième entier du fichier
  	lseek(comptes,client2*sizeof(int),SEEK_SET);
  	read(comptes,&depot2,sizeof(int));
	
  	// allez on transfère les sommes...
  	depot1 -= somme;
  	depot2 += somme;	
	
  	// écriture du i-ième entier du fichier
  	lseek(comptes,client1*sizeof(int),SEEK_SET);
  	write(comptes,&depot1,sizeof(int));
  	// écriture du i-ième entier du fichier
  	lseek(comptes,client2*sizeof(int),SEEK_SET);
  	write(comptes,&depot2,sizeof(int));
}
Ces deux fonctions sont implantées dans le même programme permettant de simuler les services d'une banque.
  1. on désire qu'à la réception du signal SIGUSR1, une opération de virement s'effectue. Écrire le code permettant d'obtenir cette fonctionnalité;
  2. on désire qu'à la réception du signal SIGUSR2, une opération de contrôle des dépôts (calcul de la somme présente sur tous les comptes) s'effectue. Écrire le code permettant d'obtenir cette fonctionnalité;
  3. après plusieurs tests, le contrôle financier s'aperçoit que de temps en temps il semble manquer de l'argent (lequel semble même réapparaître après quelques temps). Pouvez-vous identifier un tel cas ?
  4. les contrôleurs financiers étant généralement chatouilleux à propos de la sincérité des comptes, comment vous proposez-vous de corriger ce problème ? Écrire le code correspondant.