0
votes

Convertir le flotteur en chaîne et envoyer du code C à Python à travers un tuyau nommé

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)


1 commentaires

Pouvez-vous utiliser format exponentiel comme sprintf (str, "% e \ n", angle); ?


3 Réponses :


2
votes

Le premier drapeau rouge est dans le sprintf appel; Il ne sait pas à quel point votre mémoire tampon cible STR est, alors pourrait trop déborder si vous n'êtes pas prudent. Avec un seul flotteur et 64 octets, cette étape devrait aller bien.

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é Tailleof , 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 a écrit une chaîne de terminaison nul), telle que strlen (pour mesurer la chaîne) ou fputts (Pour écrire la chaîne au fichier).

Un raccourci beaucoup plus facile peut être d'utiliser fprintf en premier lieu et non pas à attribuer un tampon séparé (il utilise probablement une intégrée dans fichier ) pour stocker la chaîne formatée.

Il est possible, mais pas nécessairement portable ou sûr, de convertir entre des descripteurs de fichier (tels que écrire et fermer user) et fichier (tels que fprintf utilisations) à l'aide de fonctions telles que fdopen .


2 commentaires

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).



1
votes

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);


1 commentaires

SNPRINTF 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 . asprintf , si Disponible, permet d'attribuer un tampon suffisant dans un appel.



0
votes

J'ai résolu le problème, la solution changeait cette ligne

écriture (fd_fifo, str, taille de (str));

à

écrire (fd_fifo, str, stren (str));


2 commentaires

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 ...