FIFO à vider entre 2 lectures
Bonjour,
Je débute en C, veuillez d'avance excuser toute énormités/bêtise/erreur que je pourrais écrire ici.
Voici mon problème. Je cherche à utiliser un FIFO pour périodiquement afficher des informations dans une barre de status.
Cependant, il semble que le FIFO ne soit pas vidé entre deux lectures. Sinon, c'est que le tableau qui me sert à stocker le contenu du FIFO n'est pas vidé entre 2 exécutions.
En effet, lorsque je lance echo "treslongmessage" >> /tmp/dwmbuf → pas de soucis.
Si ensuite je lance echo "mini" >> /tmp/dwmbuf → il s'affiche alors "mini[]longmessage"
Voici la fonction qui permet de lire le FIFO :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| char *
snotif()
{
char buf[BUFSIZ];
char *retstr = NULL;
buf[0]='\0';
int f = open(FIFO, O_NONBLOCK);
if (f == -1){
perror("fifo opening");
return smprintf("%s","");
}
if (read(f, buf, sizeof(buf) ) == -1){
perror("fifo read");
return smprintf("%s","");
}
close(f);
buf[strlen(buf)-1] = '\0';
retstr = smprintf("%s",buf);
return smprintf("%s",retstr);
} |
La fonction smprintf
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
char *
smprintf(char *fmt, ...)
{
va_list fmtargs;
char *buf = NULL;
va_start(fmtargs, fmt);
if (vasprintf(&buf, fmt, fmtargs) == -1){
fprintf(stderr, "malloc vasprintf\n");
exit(1);
}
va_end(fmtargs);
return buf;
} |
Et voici la boucle dans main :
Code:
1 2 3 4 5 6 7 8 9 10
|
#define FIFO "/tmp/dwmbuf"
// code coupé
char *info = NULL;
int ret = 0;
ret = mkfifo(FIFO, ACCESSPERMS);
if (ret == -1) perror("fifo creation");
for (;;sleep(1)) {
info = snotif();
} |