Je dois envoyer des données du programme c vers le programme Perl en mode exécution (programme Perl en mode veille et c programme en cours d'exécution, et c programme envoie des données à Perl). Je sais que, peut écrire ce programme par socket et la mémoire partagée, mais j'ai des problèmes de performance. Je pense que la mémoire partagée est une meilleure solution, et comment puis-je signaler au programme Perl de se réveiller et de reprendre l'exécution et la lecture des données envoyées?Envoi de données de c à perl
Répondre
Utilisez une base de données telle que MySql.
Si vous êtes si soucieux de la performance, implémentez le code perl en C, ou vice versa.
Vous semblez avoir deux questions ici:
- comment partager la mémoire entre le programme Perl et votre programme C et
- comment signaler le programme Perl il y a de nouvelles données disponibles
En supposant que vous êtes sur un système qui autorise les appels SysV IPC, vous pouvez utiliser IPC::ShareLite pour partager un morceau de mémoire entre les deux processus.
Comme d'habitude avec la mémoire partagée, vous devrez vous assurer que les verrous sont en place. La page de manuel du module pour IPC :: ShareLite semble expliquer assez bien les intrications et les appels de méthode. En ce qui concerne la signalisation du programme Perl, il y a de nouvelles données disponibles, rien ne vous empêche d'utiliser ... des signaux pour y parvenir! Votre programme C peut envoyer un SIGUSR1 au programme Perl, et le programme Perl accédera à la mémoire partagée et fera des choses lors de la réception du signal, et dormira autrement.
Jetez un oeil à perldoc perlipc pour cela, mais l'essentiel de c'est quelque chose le long de ces lignes:
use strict;
use warnings;
use IPC::ShareLite;
# init shared memory
sub do_work {
# use shared memory, as you just received a signal
# indicating there's new data available
my $signame = shift;
# ...
}
$SIG{USR1} = \&do_work; # when signaled with SIGUSR1, call do_work()
# else just sleep
while(1) { sleep 1; }
Hope this helps,
-MARCO-
Étant donné que l'OP est assez préoccupé par les performances à envisager d'utiliser la mémoire partagée au lieu de sockets unix, je me demande comment bien les signaux font à cet égard? – user2719058
Avoir un recherche sur le sujet: "Intégration Perl (Utilisation de Perl à partir de C)" -Chapitre 21 Per l Programmation Troisième édition - mur Larry
Voir Internals and C language interface spécialement cet appel Perl partiel conventions de C. Puis, vous apprendrez comment pour envoyer efficacement des données entre le programme C et Perl.
Vous parlez toujours de "problème de performance".
Pourriez-vous être plus précis sur vos besoins de performance? Nous devons le savoir avant de pouvoir proposer une solution optimale. Sinon, nous ne faisons que deviner.
Dans la « deviner » catégorie, je recommande:
- tuyaux base de données
Chacune de ces alternatives serait d'excellentes alternatives dans une grande majorité des scénarios du « monde réel » Je pourrais penser à.
Nous avons certainement besoin de plus de détails sur votre scénario particulier.
Nous vous remercions à l'avance .. PSM
Pour expliquer: ce serait bien d'avoir une idée de la lenteur du programme: le processeur reste-t-il occupé à 100%? La lecture et l'écriture des données prennent-elles trop de temps? Avez-vous à court de mémoire? – reinierpost
Utiliser une base de données comme SQLite, alors vous n'avez pas besoin d'installer le serveur de base de données.
SQLite Bibliothèque: http://metacpan.org/pod/DBD::SQLite
- 1. Refactorisation de socket C# (envoi de données)
- 2. Interop envoi chaîne de C# à C++
- 3. Envoi de données - NSMutableURLRequest
- 4. urllib2 envoi de données
- 5. Envoi de données à un serveur Web
- 6. Envoi de données du service à l'activité
- 7. Envoi d'emails HTML à partir de C#
- 8. Envoi de données binaires sur IPC de C vers Python
- 9. AsyncSocket Delay Envoi de données
- 10. ksoap2 android envoi de données
- 11. mysql profiler "Envoi de données"
- 12. Envoi de données entre classes dans Cocoa Objective C
- 13. Envoi de données au serveur via le port 5555 C#
- 14. Envoi de la commande à la base de données SQL
- 15. Envoi de données à un site Web via HTTP
- 16. Problème - Envoi de données postscript à l'imprimante à l'aide d'ExtEscape
- 17. Envoi et réception de données XML
- 18. Envoi de données à l'aide de Jquery Iframes
- 19. Envoi de données de formulaire HTML à Java
- 20. Envoi de données gzippées dans WebRequest?
- 21. Envoi de données de formulaire gzippées
- 22. Envoi de données d'Excel à un site Web
- 23. Envoi de ByteArray à Zend_Amf
- 24. Envoi de données POST sans formulaire
- 25. Envoi de données arbitraires via plusieurs fonctions
- 26. Envoi de données POST dans XUL?
- 27. Android - Envoi de données d'une activité à un service
- 28. Python multitraitement: Envoi de données à un processus
- 29. Envoi de données vidéo à service WCF reposants avec POST
- 30. Envoi de données d'une classe à une activité?
non, je ne peux pas. J'ai un gros problème de performance – hamSh