Bonjour, je veux faire un programme en c..qui fait une ecriture seulement sur un tube et ferme la lecture jusu'à la saturation de ce dernier et la lecture ce bloque. en attendant que le tube ce vide. si un signal survient dans cet état, on affiche le nombre d'octets placés dans le tube(ca capacité). merci d'avance.. j'ai commencé avec ca:




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
 
 
 
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h> 
#include <limits.h>
 
int compteur;
 
void rien (int sig)
{
 
if (sig == SIGPIPE)
printf ("eciture dans un tube sans lecteurs \n");
printf ("%d\n",compteur);
 
}
 
 
void sature(int sig){
 
??????
 
}
int main() {
 
int n,i=0, t[2];
char buffer [512];
struct sigaction act;
 
 
	printf("la capacité du tube est :%d  \n",PIPE_BUF);	
 
	act.sa_handler =rien;/* fonction1 à lancer */;
	sigemptyset(&act.sa_mask);
	act.sa_flags = 0;
	sigaction(SIGPIPE, &act, NULL);	
 
	act.sa_handler =sature;/* traité le signal du blocage*/
	sigaction(SIGPIPE, &act, NULL);
 
 
 
	if (pipe(t) == -1){  
		perror("pipe"); 
		exit(1);
  		 }    
 
 
	close (t[0]);/*sans lecteur*/
 
	compteur=0;
	//lecture sur l'entrée standard
	while((n=read(0,buffer,sizeof(buffer)))>0)
 
 
	{
		compteur+=n;
		printf("il ya %d octets dans le tube \n",compteur);	
 
		//ecriture dans le tube
		write(t[1],buffer,n);
 
	}
 
 
 
 
 
 
 
exit(EXIT_SUCCESS);
 
}
mais le probleme c'est que l'ecriture ne ce bloque pas même si j'ai atteint la capacité du tube(PIPE_BUF).

le resultat
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
 
la capacité du tube est :4096  
 
.......
 
eciture dans un tube sans lecteurs 
4857
il ya 4877 octets dans le tube 
eciture dans un tube sans lecteurs 
4877
il ya 4878 octets dans le tube 
eciture dans un tube sans lecteurs 
4878
 
/*pas d'arret même si je depasse :4096*/