Bonjour,

J'ai un petit prblème avec ce code ci: (je vous explique plus bas comment ca marchre exactement)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
int fd_write;
int fd;
int confirmation,inscrit;
chat_request* sp;
 
void sig_hand(int sig) {
  close(fd_write);
  munmap(sp,sizeof(chat_request));
  printf("mnumap effectué.\n");
  exit(0);
}
 
void sig_sp(int sig) {
  printf("Signal SIGUSR2 recu du serveur.\n");
}
 
void sig_confirm(int sig) {
  int res;
  confirmation = 1;
  /* printf("Le serveur vous confirme votre participation.\n"); */
}
 
int main(int argc, char** argv) {
  int n;
 
  confirmation = 0;
 
  chat_request requete;
 
  sigset_t sig_proc;
  struct sigaction action;
 
  action.sa_mask = sig_proc;
  action.sa_flags = 0;
  action.sa_handler = sig_hand;
  sigaction(SIGINT,&action,0);
 
  action.sa_handler = sig_confirm;
  sigaction(SIGUSR1,&action,0);
 
  action.sa_handler = sig_sp;
  sigaction(SIGUSR2,&action,0);
 
  /* On masque SIGUSR2 */
  sigemptyset(&sig_proc);
  sigaddset(&sig_proc,SIGUSR2);
  sigprocmask(SIG_SETMASK,&sig_proc,NULL);
 
  /* Ouvrir le segment monshm, ouverture en lecture */
  if ((fd = shm_open("monshm",O_RDONLY,0700)) == -1) {
    perror("shm_open");
  }
  printf("Segment partagé ouvert en lecture.\n");
 
  /* Etablir la projection du segment de memoire partagée */
  if ((sp = mmap(NULL,sizeof(chat_request), PROT_READ, MAP_SHARED , fd , 0)) == MAP_FAILED){
    perror("mmap");
    exit(1);
  }
 
  if ((fd_write = open("tube1",O_WRONLY)) == -1) {
    perror("open");
    exit(1);
  }
  printf("Ouverture du tube nommé tube1 en ecriture.\n");
 
  while (1) {
 
    /* Ecrit l'uid du processus courant dans le chat_request */
    requete.sender_uid = getuid();
 
    /* Ecrit le pid du processus courant dans le chat_request */
    requete.sender_pid = getpid();
 
    /* Ecrit la chaine tapé par l'utilisateur dans le chat_request*/
 
    printf("Taper un texte:\n");
 
    scanf("%s",requete.msg);
    printf("scanf: %s\n",requete.msg);
 
    /* Ecriture de la chaine contenue dans buf dans le tube nommé */
    if ((n = write(fd_write,&requete,sizeof(chat_request))) == -1) {
      perror("write");
      exit(1);
    }
  } 
  return 0;
-----------------------------------------------------------------------------------

J'ai un client qui ouvre un segment de mémoire partagé préalablement crée par le serveur. Il ouvre ensuite un tube en ecriture.
Il place les données à envoyer dans chaque champ de requete qui est un struct chat_request (c pas important de savoir ce qu'il y a dedans).
Il demande à l'utilisateur de taper un texte, et ce texte sera lui aussi rajouté dans le champ de la structure à envoyer.

Il envoie ce struct, avec write, par un tube nommé qiu sera receptionné coté serveur (serveur que j'ai pas copié sur le foum.
Le serveur regardera un champ de la structure pour savoir si le client lui a bien envoyé "join" (pour se joindre).
- Si c'est pas join, le serveur zappe et voila (et il se remet en attente de qque chose dans le tube avec un read, car j'ai aussi une boucle infinie coté serveur).

- Si c'est "join", il rajoute le pid du client (qu'il aura grace a un des chams de la strcture qu'il a recu) dans un tableau.
Il envoie après cela un signal SIGUSR1 de confirmation au client avec kill, comme quoi celui-ci est bien enregistré.

Quand le client recoit ce signal, il execute sig_confirm(int sig).

Voici le pb:

Quand le client tape n'importe quoi, tout est nikel, et il m'affiche, le scanf que la personne à taper (pq j'ai rajouté ca après le scanf du client: printf("scanf: %s\n",requete.msg).

Quand le client tape par contre join, il m'afiche deux fois ma ligne scanf, comme si on avait tapé deux textes.

Or normalement, si je ne tape qu'un seul texte, le scanf, dooit resté bloquant en attendant un second texte.

J'ai testé de ne pas envoyer de signal de confimation du serveur au client, et là nikel: un seul affichage scanf...
C'est comme l'arrivée d'un signal, arrivait à débloquer un scanf qui attend du texte et un retour chariot.....:-(

Qu'en pensez-vous?

Merci
A+