2010-01-12 11 views
5

Hello overflow dello stack: a volte lettore, poster prima volta.IPC tra python app e DLL iniettata

Background:

di dialogo di Windows in esecuzione XP SP3, che sarà presto aggiornato a Windows Seven (MSDNAA < 3)

ho un DLL iniettato che ottiene cicli agganciando una funzione che si chiama migliaia di volte al secondo.

Mi piacerebbe comunicare/controllare questa DLL tramite un'applicazione python. Fondamentalmente, la DLL fa il lavoro, l'app python fornisce il cervello/il processo decisionale.

Il mio piano di gioco per fare ciò, è che avrei un contatore e un'istruzione if nella DLL. Ogni volta che viene chiamata la funzione hooked, counter ++ e quindi torna alla funzione originale fino a qualcosa come if (counter == 250) {// dostuff(); }. Il mio dietro a questo consentirà all'app di destinazione di funzionare senza impedimenti, ma mi consentirà comunque di fare cose interessanti.

Problema:

Sono ad una perdita totale del metodo IPC dovrei usare per fare la comunicazione. Abbiamo prese, memoria condivisa, pipe, filemapping (?), RPC e altre cose (apparentemente) esoteriche come scrivere negli appunti.

Non ho MAI implementato alcun tipo di IPC oltre gli esempi di giocattoli.

Sono abbastanza sicuro ho bisogno di qualcosa che:

  • in grado di gestire a parlare avanti e indietro tra Python e una DLL
  • non blocca/aspettare
  • possibile controllare per l'attesa dei dati, e continuare se non v'è alcuna
  • Se le serrature sono coinvolti, può continuare invece di aspettare
  • non costa un sacco di tempo a/lettura e scrittura troppo

Aiuto? Grazie per il vostro tempo, spero di aver fornito informazioni generali sufficienti e di non aver infranto le convenzioni accettate.

Vorrei aggiungere che la relativa casella delle domande è molto interessante e l'ho esaminata prima di postarla.

risposta

2

Prova prese. Le vostre richieste sono essenzialmente un requisito del funzionamento asincrono; Python ha il modulo asyncore per gli I/O asincroni sui socket. Allo stesso tempo, non sembra che lo stdlib di Python possa gestire in modo asincrono altre cose IPC, quindi non le consiglierei di usarle.

1

Se non ti interessa il tempo reale, puoi utilizzare il file system per la comunicazione: un file di registro per l'output della DLL e un file di configurazione letto ogni tanto per modificare il comportamento delle DLL.

+1

L'utilizzo di un file di registro è * non * un IPC. – ulidtko

+0

@ulidtko Il file system è la più antica e affidabile forma di sincronizzazione IPC. Ecco perché lo standard POSIX ha la stessa API per tutte le forme di IPC. Poiché il sistema operativo ** deve ** gestire la coerenza e la sincronizzazione nelle operazioni del file system (o non essere chiamato un sistema operativo), il file system è l'implementazione più semplice di IPC da utilizzare per programmi non OS. Prova 'ls/var/run/*.pid' la prossima volta che si ha accesso a un sistema * nix. – Apalala

+1

La stampa è una forma ancora più vecchia e affidabile di ... memorizzazione di informazioni su carta. Il sistema operativo ** deve ** gestire la coerenza di ciò che verrebbe stampato e ogni essere umano può gestire tutta la sincronizzazione necessaria. Perché non proverai a stampare un "Ciao mondo!" su carta, quindi esegui la scansione e l'OCR per controllare il tuo programma? Ci dispiace, ma il tuo commento non è solo un argomento. Le stampanti devono stampare documenti, i filesystem devono memorizzare i file, shmem-pipes-sockets dovrebbe fornire i modi per fare IPC. – ulidtko