Examen de Systèmes II--Licence--Juin 2003

Exercice

Écrire une fonction de prototype void fils(int n,void (*g)(void)); permettant de créer n processus fils exécutant tous la fonction g passée en argument.

Exercice

  1. Écrire un programme permettant d'ajouter un caractère (tiré au hasard) toutes les secondes à la fin d'une chaîne de caractères;
  2. Ajouter une fonction, appelée à la réception du signal SIGUSR1, permettant d'afficher la chaîne;
  3. Ajouter une fonction, appelée à la reception du signal SIGUSR2, permettant de supprimer un caractère sur deux de la chaîne.

Exercice

Soit le programme suivant:
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
int ok;
void capture(int sig) {
        wait(NULL);
        printf("Ok on continue... (p\xe8re)\n");
        ok = 1;
}
int main(int argc,char *argv[]) {
        struct sigaction action;
        sigset_t ens;
        ok = 0;
        action.sa_handler = capture;
        action.sa_flags = 0;
        sigemptyset(&(action.sa_mask));
        sigaction(SIGUSR1,&action,NULL);
        if (fork()==0) {
                printf("Je calcule (fils)\n");
                kill(getppid(),SIGUSR1);
                exit(0);
        }
        if (ok==0) { pause(); }
        printf("Je calcule la suite (p\xe8re)\n");
}
  1. Que fait ce programme ? Qu'affiche-t'il ?
  2. Que se passe-t'il si le fils effectue son appel à kill juste avant que le père appelle pause ?
  3. Comment corriger ?

Exercice

É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 écrivant 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).

Exercice

  1. Qu'est qu'un processus zombi ?
  2. Écrire un programme dont l'exécution conduit à la création d'un processus zombi ?
  3. Comment fait-on disparaître un tel processus ?
  4. Qu'est-ce qu'un processus orphelin ?
  5. Écrire un programme conduisant à la création d'un processus orphelin.

Problème

On se propose d'écrire un ensemble de fonctions permettant d'implanter des boîtes à lettres en utilisant un segment de mémoire partagée.
  1. Écrire la fonction BOITE *ouvre(char *ref,int mode,int maxmsg,int maxtaille); permettant d'ouvrir une boîte à lettres. Si le mode contient CREATION un segment de mémoire partagée est créé pouvant contenir au plus maxmsg courriers chacun de taille au plus maxtaille. Si le mode contient LECTURE, les appels à recoit seront autorisés. Si le mode contient ECRITURE, les appels à envoie seront autorisés;
  2. Écrire la fonction int envoie(BOITE *boite,void *msg,int longueur); permettant d'envoyer
    longueur octets à l'adresse msg dans la boite. En cas d'impossibilité un code de retour particulier devra indiquer la cause de l'erreur;
  3. Écrire la fonction int recoit(BOITE *boite,void *msg,int longueur); permettant d'extraire (lire et effacer de la boite) un courrier dont le contenu sera placé à l'adresse msg pouvant contenir au plus longueur octets. La longueur du message effectivement extrait est renvoyée en cas de succés. Si l'extraction est impossible un code d'erreur sera renvoyé;
  4. Écrire une fonction void ferme(BOITE *boite); permettant de fermer la boite à lettres.
Note: il est conseillé de décrire les structures employées et de décrire succintement en français chaque fonction/algorithme employé...

Jean-Baptiste Yunès 2003-09-05