2013-03-08 4 views
2

Récemment, j'ai été chargé de personnaliser l'une des applications que nos groupes utilisent assez régulièrement. L'application est écrite en C, quelque chose que je n'ai pas beaucoup d'expérience. J'ai trouvé quelques exemples fonctionnels de ce que j'essaye de faire mais pour l'instant j'ai été incapable de l'intégrer complètement dans mon banc d'essai.FIFO (pipe nommée) en C

L'exigence est assez simple: ouvrez un tube nommé et expulsez des données afin qu'un autre groupe puisse lire le tube et faire quelque chose avec lui. Cela doit être fait de telle sorte qu'il n'interrompe pas le serveur de faire son truc.

Mon application a un tableau appelé historique qui contient toutes les valeurs nécessaires que je suis après. J'ai jusqu'ici eu des résultats mitigés avec mes tentatives d'accomplir ceci. S'il vous plaît voir ci-dessous extrait de code:

DCmass_add_history(history, history_num); 

int fd; 
char * myfifo = "/tmp/fooPipe"; 

/* create the FIFO (named pipe) */ 
mkfifo(myfifo, 0666); 

/* open FIFO (named pipe) */ 
fd = open(myfifo, O_WRONLY); 
    for (i = 0; i < history_num; i++) { 

    /* Write our data to our FIFO (named pipe) */ 
    fprintf(fd, "%d %d %f %f", history[i].id, history[i].clock, history[i].value, history[i].ns); 

} 
close(fd); 

J'ai eu un certain succès précédemment lors de l'utilisation du write au lieu de fprintf mais n'a pas pu obtenir des variables dans ma pipe. À partir d'un exemple précédent de débordement de pile, Stack Overflow example j'ai pu obtenir un lecteur de base pour tester mon tuyau, et le code de base d'en haut pour ouvrir mon tuyau.

+4

'fprintf()' prend un 'FICHIER *'; pas un descripteur 'int'. – WhozCraig

Répondre

3

L'avertissement que vous recevez sur la ligne fprintf() devrait être un indice.

Si vous souhaitez utiliser fprintf(), vous devez ouvrir un FILE * pour l'aide fopen(), non open():

FILE *fd = fopen(myfifo, "w"); 

et fermer à l'aide fclose().

0

Vous devez maintenir un contrôle strict sur votre mise en mémoire tampon. Je suppose que setlinebuf() aiderait mais j'utilise toujours snprintf() pour mettre en forme des variables dans un buffer et write() totalement sous mon contrôle. Lignes entières à la fois. Ce qui peut vous arriver avec printf() est de plus gros tampons, une fois que suffisamment de lignes s'accumulent sans setlinebuf(), seule une partie de la ligne formera. En utilisant explicitement write() avec des tampons suffisamment petits pour assurer les écritures atomiques (vérifiez les limites de votre OS local), vous pouvez être assuré qu'aucune ligne n'est divisée.

Les lecteurs doivent être très prudent lors de la lecture fifos à remarquer ces lignes de séparation pour continuer la lecture jusqu'à \ n, mais tout le monde est bien prudent et ce peut être votre problème

0

Vous pouvez écrire comme ça, si vous voulez utiliser FifoFile

char * mesg; 
// allocating for mesg; and then 

sprintf(msg, "%d %d %f %f", history[i].id, history[i].clock, history[i].value, history[i].ns); 

write(fd, msg, sizeof(msg)); 

J'espère que cela vous sera utile!

0

cela ne donnera que vous voulez

int fd; 

pour des missions de fichiers

FILE *fd = fopen(fileName , option); 

fileName comme temp.txt, base de données.txt

Option

- r (lisible)

-w (inscriptible)

-r + et w + (écrire et lire avec ajouter le texte à partir de la dernière ligne)

Questions connexes