2013-02-07 14 views
5

Ich habe zwei ausführbare Dateien in C++ unter Windows geschrieben. Ich erzeuge einige Daten in einem und möchte die andere ausführbare Datei aufrufen, um diese Daten zu verarbeiten. Ich könnte die Daten in eine Datei schreiben und sie dann in der anderen ausführbaren Datei lesen, aber das scheint in Bezug auf die Platten-E/A ziemlich teuer zu sein. Was ist ein besserer Weg, dies zu tun? Es scheint eine einfache Frage zu sein, aber Google hilft einfach nicht!Übertragen von Daten zwischen ausführbaren Dateien

Nehmen wir an, dass die Daten etwa 100 MB groß sind und vollständig generiert werden, bevor sie gesendet werden müssen (d. H. Kein Streaming wird benötigt).

Antworten, die beim Mischen von 32-Bit- und 64-Bit-Prozessen funktionieren, erhalten Bonuspunkte.

+3

Named Pipes, lokale Winsockets, Speicher-Mapped Files, Shared Memory, Mail-Slot, Registrierung, Fenstermeldungen (nicht gut für große Daten), was sonst? Treffen Sie Ihre Wahl. Wenn Sie uns etwas mehr über die Daten (Größe, etc.) und die Art, auf die Sie die Daten teilen möchten, erzählen, können wir besser beraten, welche Methode am besten ist. – thang

+1

Im Allgemeinen wird dies als [Interprozesskommunikation] (http://en.wikipedia.org/wiki/Inter-process_communication) bezeichnet. – Oswald

+0

Sicher, ich habe ein paar Informationen über die Daten hinzugefügt. Ursprünglich habe ich nur "großen Betrag" geschrieben, aber meine Frage vor dem Posten bearbeitet, ich hätte eigentlich nur ein paar Zahlen geben sollen :) –

Antwort

4

Wenn Ihre Prozesse einfach in eine Datei schreiben und aus ihr lesen können, machen Sie einfach weiter. Erstellen Sie die Datei mit CreateFile und markieren Sie sie als temporär & shareable. Windows verwendet diesen Hinweis, um physische Schreibvorgänge zu verzögern, aber alle Dateisemantiken werden weiterhin befolgt. Da Ihre Datei nur 100 MB groß ist und aktiv verwendet wird, kann Windows seinen Inhalt fast vollständig im Arbeitsspeicher halten.

+0

Ok, ich wusste nicht, dass diese Art von Caching so zuverlässig ist. Definitiv die einfachste Lösung, danke :) –

3

Sie können Boost.MPI verwenden. Es ist von Boost, die hohen Qualitätsstandard hat, und das Codebeispiel scheint ziemlich eindeutig:

http://www.boost.org/doc/libs/1_53_0/doc/html/mpi/tutorial.html#mpi.point_to_point

// The following program uses two MPI processes to write "Hello, world!" 
// to the screen (hello_world.cpp): 

int main(int argc, char* argv[]) 
{ 
    mpi::environment env(argc, argv); 
    mpi::communicator world; 

    if (world.rank() == 0) { 
    world.send(1, 0, std::string("Hello")); 
    std::string msg; 
    world.recv(1, 1, msg); 
    std::cout << msg << "!" << std::endl; 
    } else { 
    std::string msg; 
    world.recv(0, 0, msg); 
    std::cout << msg << ", "; 
    std::cout.flush(); 
    world.send(0, 1, std::string("world")); 
    } 
    return 0; 
} 
+0

Boost hört nie auf, mich zu überraschen! Dies scheint eine gute Option zu sein, vor allem, wenn ich dies auf mehrere Maschinen ausweiten möchte, aber jetzt gehe ich mit der einfacheren Option, sich auf Datei-Caching zu verlassen, wie MSalters vorschlägt. –

1

Vorausgesetzt, dass Sie nur „eine Richtung“ gehen wollen (das heißt, die Sie nicht brauchen um Daten vom untergeordneten Prozess zurück zu bekommen), könnten Sie _popen() verwenden. Sie schreiben Ihre Daten in die Pipe und der Kindprozess liest die Daten von stdin.

Wenn Sie einen bidirektionalen Datenfluss benötigen, müssen Sie zwei Pipes verwenden, einen als Input und einen als Output, und Sie müssen ein Schema für die Verbindung des Child-Prozesses mit diesen Pipes einrichten Legen Sie immer noch die stdin/stdout als Datenpfad fest, aber Sie könnten auch ein Paar Named Pipes verwenden]. Eine dritte Option ist eine shared memory Region. Ich habe das nie in Windows gemacht, aber das Prinzip ist ziemlich genau das, was ich in Linux [und viele Jahre zurück in OS/2] verwendet habe: 1. Erstellen Sie eine Speicherregion mit einem gegebenen Namen in Ihrem Elternteil verarbeiten. 2. Der Kindprozess öffnet den gleichen Speicherbereich. 3. Daten werden vom übergeordneten Prozess gespeichert und vom untergeordneten Prozess gelesen. 4. Falls erforderlich, können Semaphore oder ähnliches verwendet werden, um die Fertigstellung/Ergebnisse bereit zu erklären/etc.

+1

Ich habe etwas Neues gelernt :) Danke! Pipes klingen nach einer guten Option, aber ich denke Shared Memory impliziert einen gemeinsamen Adressraum, der beim Mischen von 32- und 64-Bit-Prozessen nicht funktionieren würde. –

+0

Wie ich nicht versucht habe, weiß ich nicht, aber ich glaube, solange Sie einen benannten gemeinsamen Speicher verwenden, und überschreiten Sie nicht die Adressgrenze von 32-Bit [so weniger als 2 GB], sollte es funktionieren. Denken Sie daran, keine Zeiger in Ihren gemeinsamen Speicher zu legen. Der Speicher wird (notwendigerweise) nicht an der gleichen Adresse geteilt. –

+0

Ah richtig, ich habe das Codebeispiel falsch verstanden. Ja, es sieht so aus, als ob es so funktioniert. Danke x2! –

Verwandte Themen