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 :
La fonction smprintf
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 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); }
Et voici la boucle dans main :
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 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; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); }
Partager