Voila mon probleme :
j'ai ecrit un programme qui envoie un message d'un nouveau type dans un pipe qui va communiquer entre le pere et le fils apres un fork.

il fonctionne, grace à une astuce que l'on m'a donné sur ce meme forum :
voici le code :
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
 
typedef struct
{
        char* message;
        int entier;
}nouveau;
 
 
 
int main()
{
 int tube[2],p;
pipe(tube);
nouveau * data;
p = fork();
if(p==0){close(tube[0]);
   data->entier = 42;
   data->message = "pouet pouet";
   write(tube[1], data, sizeof(nouveau));      
 
} else {   
   close(tube[1]);  
   read(tube[0], data, sizeof(nouveau));
   printf("%s\n",data->message);
 
} 
    return 0;
 
 
}
Le prog affiche bien "pouet pouet" ce qui montre que c bon

Ensuite, je me suis dis que puisque cette facon de faire fonctionne, je vais tester le meme programme en créant un thread dans le processus pere qui envoie et un thread dans le processus fils qui recoit :
voici le code :
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
typedef struct
{
        char* message;
        int entier;
}nouveau;
 
 int tube[2];
 
 
pthread_t env,rec;
 
void* envoyer(void* arg)
{  
   nouveau * data;
   int n;   
   printf("ici pere\n");
   close(tube[0]);
   data->entier = 42;
   data->message = "pouet pouet";   
   write(tube[1], data, sizeof(nouveau));
    printf("ici fin pere\n");  
    pthread_exit(NULL);      
}
 
 
void* recevoir(void* arg)
{   
   nouveau * data; 
   printf("ici fils\n");
   close(tube[1]);  
   if(read(tube[0], data, sizeof(nouveau))>0)
   {printf("%s\n",data->message);}
   printf("ici fin fils\n");    
   pthread_exit(NULL);  
}
 
int main()
{
int p;
pipe(tube);
p = fork();
if(p!=0){
         /*pere enoie*/
   pthread_create(&env,NULL,envoyer,NULL);
} else {   
       /*fils recoit*/
   pthread_create(&rec,NULL,recevoir,NULL);
} 
 
    return 0;    
}
seulement lorsque je l'execute, j'ai ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
ici pere
ici fin pere
ici fils
et il me rend la main .

Quelqu'un aurait une idée de ce qu'il faudrait modifier pour que ceci fonctionne ? ( je voudrais que le message pouet pouet soi affiché )