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 :
Donc ce programme est censé, une fois lancé, afficher à l'écran les chaine de caracteres qu'on tape.
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; }
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.
Partager