2010-08-26 3 views
4

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

2

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.

+0

non, je ne peux pas. J'ai un gros problème de performance – hamSh

7

Vous semblez avoir deux questions ici:

  1. comment partager la mémoire entre le programme Perl et votre programme C et
  2. 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-

+0

É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

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

1

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

+0

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