1 Répondre à des questions de cours Répondre par OUI ou NON aux questions suivantes OUI Lorsqu'un processus est créé par fork, le processus parent et le processus enfant exécutent le même programme, à partir de l'instruction qui suit fork() La valeur retournée par fork est 0 dans le processus enfant OUI mais c'est le n° de PID du processus créé dans le processus parent NON exec permet de créer un nouveau processus OUI exit( ) permet au processus enfant de transmettre au parent un code de fin d'exécution OUI wait permet au processus parent d'attendre la fin de l'exécution d'un processus enfant OUI sleep (10) met le processus courant en sommeil pendant 10 secondes OUI le sommeil d'un processus est interrompu lorsqu'il reçoit un signal OUI lorsqu'il est réveillé le processus exécute la fonction associée au signal NON s'il est réveillé par un signal avant la fin du délai défini par sleep(), le processus se rendort si un processus était endormi parce qu'il attendait que l'opérateur frappe une réponse à une question, ce processus NON n'est pas réveillé par un signal OUI Il est possible de demander à un processus d'ignorer les signaux 2 et 3 NON Il est possible de demander à un processus d'ignorer tous les signaux NON les signaux et les tubes (pipes)sont des mécanismes de synchronisation NON les sémaphores et les files de messages sont des mécanismes de communication de données NON la fonction signal permet d'envoyer un signal à un processus OUI la fonction signal permet d'associer une fonction de traitement à un signal donné OUI la fonction kill sert à tuer un processus l'envoi du signal N° 9 à un processus tue ce processus OUI et il n'est possible ni d'ignorer ce signal ni de lui affecter une autre action OUI la fonction pause est équivalente à une fonction sleep avec un temps infini OUI la fonction alarm(10) programme l'envoi du signal SIGALRM au processus courant dans 10 s OUI la fonction pipe(p) crée un tube constitué de 2 descripteurs de fichiers un pour écrire p[1] un pour lire p[0] OUI plusieurs processus peuvent lire dans le même tube NON un seul processus peut écrire dans un tube donné NON plusieurs processus peuvent lire successivement la même donnée dans un tube OUI un tube créé par un processus est connu dans tous les processus enfants de ce processus NON Une file de message est identifiée par un numéro de 8 octets (16 chiffres hexadécimaux) OUI la fonction ftok( ) sert à générer un identificateur d'objet IPC à partir d'un nom de fichier NON un message déposé dans une file de message est de longueur fixe : 256 octets OUI un type de message (dans une file de messages) est un nombre strictement positif NON il est possible de déposer des messages de type 0 (fonction msgsnd) dans une file de message OUI il est possible de rechercher des messages de type 0 (fonction msgrcv) dans une file de message OUI il est possible de rechercher des messages de type -5 (fonction msgrcv) dans une file de message par défaut la recherche d'un message dans une file bloque le processus s'il n'y a pas de messages correspondant OUI au type cherché (fonction msgrcv) NON tout processus peut envoyer un signal à n'importe quel processus (fonction kill) OUI comme pour les fichiers il est possible de définir des droits d'accès de type RWX pour une file de messages NON tout processus peut lire ou écrire dans une file de messages quelle que soit cette file OUI la fonction msgctl permet de définir des droits d'accès sur une file de messages 2 Concevoir une application multitâche IPC (10 points) On souhaite implémenter une système de traduction automatique de messages sous forme d'application multitâche utilisant les IPC d'Unix. L'architecture générale de l'application sera la suivante : un processus traducteur reçoit sous forme de chaînes de caractères (délimitées par le caractère NULL '\0') des messages à traduire provenant 1 ou plusieurs processus "clients" ce processus traduit les messages en fonction d'un algorithme et d'un dictionnaire qu'il n'est pas nécessaire de préciser ici il renvoie ensuite les messages traduits au processus client On vous demande de proposer 2 mécanismes IPC (autres que les sockets) pour l'échange de messages entre le processus traducteur et les processus clients. On devra donc préciser quels objets de type pipe (tube), files de messages, mémoire partagée, sémaphores… il sera nécessaire de créer pour cette application; combien d'objets seront nécessaires et quel processus devra les créer. On devra aussi se poser la question de l'identification des "canaux de communication" utilisés par les processus qui envoient ou reçoivent les messages. 3 Comprendre un programme en langage C #include #include #include #include #include #include #include #include <stdio.h> <ctype.h> <signal.h> <sys/types.h> <sys/ipc.h> <sys/msg.h> <sys/stat.h> <fcntl.h> char *strupr(char *texte) { int i; for(i=0; i<strlen(texte); i++) texte[i]=toupper(texte[i]); return texte; } char *strlwr(char *texte) { int i; for(i=0; i<strlen(texte); i++) texte[i]=tolower(texte[i]); return texte; } void reveil() { signal(SIGUSR1, reveil); } int main(void) { char msg[256],c; int flag1=0, f1=0, f2=0, p[2], choix, status, lu, retour; pipe(p); f1=fork(); if(f1!=0) f2=fork(); if((f1<0)&&(f2<0)) { fprintf(stdout, "erreur de ceration de processus\n"); exit(-2); } if(f1==0) { signal(SIGUSR1, reveil); do{ pause(); read(p[0], msg, 256); write(p[1], strupr(msg), 256); kill(getppid(), SIGUSR1); }while(msg[0]!='$'); exit(0); } if(f2==0) { signal(SIGUSR1, reveil); do{ pause(); read(p[0], msg, 256); write(p[1], strlwr(msg), 256); kill(getppid(), SIGUSR1); }while(msg[0]!='$'); exit(0); } if((f1>0)&&(f2>0)) { signal(SIGUSR1, reveil); do{ fprintf(stdout, "taper un texte comportant majuscules et minuscules ($=FIN) :\n"); do fgets(msg, 254, stdin); while (strlen(msg)<2); if (msg[0]=='$') break; write(p[1], msg, 256); fprintf(stdout, "choix : MAJ (1) sinon MIN .... : "); fflush(stdin); scanf("%d", &choix); if(choix==1) kill(f1, SIGUSR1); else kill(f2, SIGUSR1); sleep(100); lu=read(p[0], msg, 256); if(lu!=0 && lu!=-1) { fprintf(stdout, "\n RESULTAT = %s \n", msg); } else { fprintf(stdout, "\n ERREUR, PAS DE RETOUR RECU \n"); return(-2); } }while(msg[0]!='$'); kill (f1, SIGKILL); kill (f2, SIGKILL); exit (0); } }