Bonjour,
Je me suis mis récemment à programmer en C sous linux, et j'ai écris (et recopié certain passages, comme les déclarations de sémaphores et de threads) ce programme :

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
 
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
#define MAX 100
 
sem_t mutex, vide, plein;
char tampon[MAX];
pthread_t tid[2];
 
void* proc(void* i);
 
int main()
{
   int i;
 
   sem_init(&mutex, 0, 1);
   sem_init(&vide, 0, MAX);
   sem_init(&plein, 0, 0);
 
   for(i = 0; i<2; i++)
      pthread_create(tid + i, NULL, (void*(*)())proc, (void*) i );
 
   for(i = 0; i<2; i++)
      pthread_join(tid[i], (void*)i);
 
   return 0;
}
 
void* proc(void* i)
{
   int rep;
   int positionLecteur = 0;
   int positionEcrivain = 0;
 
   if(i==0)
   { // thread Lecteur
      do
      {
         sem_wait(&plein);
         sem_wait(&mutex);
 
         rep = write(STDOUT_FILENO, &tampon[positionLecteur], 1);
 
         sem_post(&mutex);
         sem_post(&vide);
      }while( rep != 0);
 
   else
   { // thread ecrivain
      do
      {
          sem_wait(&vide);
          sem_wait(&mutex);
 
          rep = read(STDIN_FILENO, &tampon[positionEcrivain], 1);
 
          sem_post(&mutex);
          sem_post(&plein);
       }while( rep != 0) ;
    }
    return NULL;
}
Donc ce programme est censé, une fois lancé, afficher à l'écran les chaine de caracteres qu'on tape.
Il marche parfaitement sous KDE (je ne m'y connais pas trop sur linux, mais je sais que c'est une distrib debian).

Je l'ai testé sur mon portable, sur lequel j'ai installé Ubuntu (une distrib issue de Debian). La compilation ne génère ni erreur, ni warning, et le programme se lance sans planté. Mais aucun caractere ne s'affiche lorsque j'en tape au clavier.

J'ai demandé à un ami qui utilise Sygwin de le tester. Le programme génère une segmentation fault chez lui.

Et pour finir, une autre personne (mais je ne sais pas quelle version de linux elle a utilisé) a tenté de le compiler. Là, des erreurs générées dues à la conversion void* en void** (ou le contraire, je ne sais pas...).
Et après quelques corrections, elle est parvenue à lancer le programme, mais comme sur mon portable, aucun caractère ne s'affiche (mis à par la chaine qu'on vient juste d'écrire bien sur).


De plus , en écrivant le code sur ce forum, je me rends compte d'une chose : la lettre 'i' est utilisée comme compteur de boucle , mais elle est aussi utilisée dans la définition et la déclaration de la fonction proc. Ca me parait louche...

Derniere remarque : j'ai utilisé un do_ while avec comme condition rep!=0 . Je ne suis pas sur que ce soit trés utile. Sur les pc de mon école (là où le programme fonctionne) un do _ while (1) marche trés bien aussi.



Quelqu'un pourrait il m'éclairer un peu? Car je suis complétement perdu.
Merci beaucoup.