Je voudrais envoyer des valeurs de flotteur du code C dans le code Python à l'aide de tuyaux nommés. J'imprime les valeurs reçues dans la borne du côté Python, cependant ainsi que la valeur elle-même, les caractères gibberish sont également affichés.
Ouverture de tuyau: strong> p> #!/usr/bin/python
import os
import errno
import time
FIFO = '/tmp/bldc_fifo'
try:
os.mkfifo(FIFO)
except OSError as oe:
if oe.errno != errno.EEXIST:
raise
print("Opening FIFO...")
with open(FIFO, encoding='utf-8', errors='ignore') as fifo:
print("FIFO opened")
while True:
time.sleep(0.1)
data = fifo.read()
print(data)
3 Réponses :
Le premier drapeau rouge est dans le Cependant, vous n'avez pas stocké la valeur de retour, alors à ce stade, vous ne savez pas à quel point le texte formaté est grand. Ensuite, vous avez utilisé Un raccourci beaucoup plus facile peut être d'utiliser Il est possible, mais pas nécessairement portable ou sûr, de convertir entre des descripteurs de fichier (tels que sprintf code>
appel; Il ne sait pas à quel point votre mémoire tampon cible STR code> est, alors pourrait trop déborder si vous n'êtes pas prudent. Avec un seul flotteur et 64 octets, cette étape devrait aller bien. p>
Tailleof CODE>, qui vous indique la taille du tampon, non de la quantité de données que vous venez d'y mettre. Vous pouvez utiliser une fonction à base de cordes (puisque
sprintf code> a écrit une chaîne de terminaison nul), telle que
strlen code> (pour mesurer la chaîne) ou
fputts code > (Pour écrire la chaîne au fichier). p>
fprintf code> en premier lieu et non pas à attribuer un tampon séparé (il utilise probablement une intégrée dans
fichier code>) pour stocker la chaîne formatée. p>
écrire code> et
fermer code> user) et
fichier code> (tels que
fprintf code> utilisations) à l'aide de fonctions telles que
fdopen code>
. p>
Je pense que je ne peux pas utiliser fprintf parce que j'utilise des tuyaux nommés, pas un fichier
... C'est pourquoi le dernier paragraphe explique que vous pouvez envelopper un descripteur de fichier. Vous êtes dans un système de type UNIX, tout est un fichier (un tuyau nommé n'est qu'un fichier légèrement spécial).
La ligne:
int ret = sprintf(NULL, "%f", ...); assert(ret > 0); char *str = malloc(ret * sizeof(char)); if (str == NULL) { // handler error } ret = snprintf(str, "%f", ...); write(fd_fifo, str, ret); free(str);
SNPRINTF CODE> renvoie le nombre de caractères qui auraient été écrits, de sorte que si vous souhaitez vraiment vous protéger contre les dépassements de tampon, vous devez également vérifier
RET <= Tailleof Str code>.
asprintf code>
, si Disponible, permet d'attribuer un tampon suffisant dans un appel.
J'ai résolu le problème, la solution changeait cette ligne p>
à p>
écriture (fd_fifo, str, taille de (str)); code> p>
écrire (fd_fifo, str, stren (str)); code> p>
Qui est l'une des trois solutions d'environ trois solutions indiquées par moi et par Kamil.
@Yannvernier Désolé je n'ai pas réalisé la suggestion de Strlen que vous avez donné que j'étais endormi, je suppose que mon mauvais ...
Pouvez-vous utiliser format exponentiel comme
sprintf (str, "% e \ n", angle); code>?