1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
| /* Pour printf et fgets */
#include <stdio.h>
/* Pour strcmp */
#include <string.h>
/* Pour fork, pipe et exec */
#include <unistd.h>
/* Pour malloc, free, exit ... */
#include <stdlib.h>
/*Fonction qui découpe une chaine de caractères en un tableau de mots*/
char **decoupe (char *chaine)
{
/*Allocation de mémoire pour le tableau */
char **tableau = malloc (10 * sizeof (char *));
/*On teste sur l'allocation a bien fonctionné */
if (tableau != NULL)
{
/*Si elle a bien fonctionné, on continue... */
char *morceau = NULL;
morceau = strtok (chaine, " ");
int cpt = 0;
while (morceau != NULL)
{
tableau[cpt] = morceau;
cpt++;
morceau = strtok (NULL, " ");
}
}
return tableau;
/*
* Interpréteur de commandes, renvoie 1 si il faut quitter
* l'application, 0 sinon.
*/
int interp_commande(char* ligne, char* mon_nom) {
/* découpage de la ligne de commande en un tableau de mots */
char **tableau = NULL;
tableau = decoupe(ligne);
commande = tableau[0];
char *mon_nom = tableau[1];
switch (commande) {
case 'p':
pid_t pid;
/* Tester si il y a bien un nom en argument*/
if (mon_nom == NULL)
{
perror("Pas de nom en argument.");
return quit = 1;
}
/*Remarque: ce test a déjà été effectué dans le 'main()'*/
/* pour parler il faut creer 2 processus, chacun devant executer
une fenetre de dicussion */
/* Création du 1er processus fils*/
pid = fork();
if (pid < 0) {
perror("fork");
} else if (!pid) {
/* Code du premier processus fils */
int moi_vers_autre[2];
/* creation des DEUX tuyaux de communication (pipe) */
if (pipe(moi_vers_autre) < 0) {
perror("pipe moi vers autre");
/* quitter */
return 1;
}
//...
/* creation d'un 2eme processus */
//...
if (pid) {
/* 1er processus (fenetre 1 : autre) */
/* fermeture des DEUX extrémités du pipe non utilisées */
close(moi_vers_autre[1]);
//...
/* Ecriture des DEUX descripteurs des pipe dans des chaines */
sprintf(spfdin, "%d", moi_vers_autre[0]);
//...
} else {
/* 2eme processus (fenetre 2 : moi) */
/* fermeture des DEUX extrémités du pipe non utilisées */
//...
/* Ecriture des DEUX descripteurs des pipe dans des chaines */
//...
}
/* Retour dans les 2 processus fils (fenetres 1 et 2) */
/* Creation du titre de la fenetre de dicussion */
sprintf(...);
/* Execution des 2 processus de discussion dans des terminaux
graphiques. Utiliser le terminal 'xterm' avec l'option '-T'
pour donner un titre a la fenetre et l'option '-e' pour donner
la commande a executer */
execlp(...);
/* Si exec() retourne c'est qu'il y a eu une erreur */
perror("exec");
} /* Retour dans le pere (PMI) */
break;
case 'q':
return 1;
break;
default:
//...
}
/* Liberation de la mémoire occupée par le tableau d'arguments (args) */
free(tableau);
/* Retourner en signalant que l'on ne quitte pas le processus */
//return ...
}
int main(int argc, char **argv) {
int quit = 0;
/* Faire un test de présence du nom d'utilisateur en argument */
if (argc != 2)
{
printf("Erreur. Pas de nom d'utilisateur en argument");
}
/* Boucle d'interprétation ds commandes */
while(!quit) {
char[64]=ligne;
/* afficher un prompt */
printf("> ");
/* Lecture d'une ligne */
fgets(ligne,64,stdin);
/* Suppression du retour chariot */
lgrChaine = strlen(ligne);
ligne[lgrChaine - 1] = '\0';
/* Interprétation de la ligne de commande */
quit = interp_commande(ligne, argv[1]);
}
} |
Partager