Répondre à des questions de cours

publicité
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);
}
}
Téléchargement