Ist es möglich, Funktionszeiger über Prozesse hinweg zu verwenden?

7

Ich bin mir bewusst, dass jeder Prozess seinen eigenen Speicheradressraum erstellt, aber ich frage mich,

Wenn Prozess A eine Funktion wie folgt haben sollte:

%Vor%

und ein Zeigertyp wie:

%Vor%

und eine Getterfunktion wie:

%Vor%

und eine magische Art, mit Prozess B über ... zu kommunizieren, sagen wir boost :: interprocess

wäre es möglich, den Funktionszeiger an Prozess B zu übergeben und

aufzurufen

Bearbeiten Sie DoStuff von Prozess B direkt?

    
Maciek 13.10.2009, 17:08
quelle

6 Antworten

8

Nein. Alles ein Funktionszeiger ist eine Adresse im Adressraum Ihres Prozesses. Es hat keinen intrinsischen Marker, der für verschiedene Prozesse einzigartig ist. Also, selbst wenn Ihr Funktionszeiger gerade noch gültig wäre, sobald Sie ihn nach B verschoben haben, würde er diese Funktion im Namen von Prozess B aufrufen.

Zum Beispiel, wenn Sie

hatten %Vor%

Wenn Prozess A und B denselben Code ausführen, könnten Sie identische Funktionen an identischen Adressen erhalten - aber Sie arbeiten immer noch mit den Datenstrukturen und dem globalen Speicher von B! Die kurze Antwort lautet also: Nein, so wollen Sie das nicht!

Auch Sicherheitsmaßnahmen wie die Adressraum-Layout-Randomisierung könnten verhindern, dass diese Art von "Tricks" jemals funktioniert.

Sie verwechseln IPC und RPC. IPC dient zum Übertragen von Daten, z. B. von Objekten oder einem Textblock. RPC dient zur Ausführung von Code in einem Remote-Prozess.

    
Steven Schlansker 13.10.2009, 17:23
quelle
8

Kurz gesagt, Sie können keinen Funktionszeiger verwenden, der an einen anderen Prozess übergeben wurde.

Funktionscodes befinden sich in geschützten Seiten des Speichers, Sie können nicht in sie schreiben. Und jeder Prozess hat einen isolierten virtuellen Adressraum, so dass die Adresse der Funktion in einem anderen Prozess nicht gültig ist. In Windows können Sie die in diesem Artikel beschriebene Technik verwenden, um Ihren Code in einen anderen Prozess zu injizieren, aber die neueste Version von Windows lehnt es ab.

Anstatt den Funktionszeiger zu übergeben, sollten Sie eine Bibliothek erstellen, die in beiden Prozessen verwendet wird. In diesem Fall könnten Sie eine Nachricht an einen anderen Prozess senden, wenn Sie diese Funktion aufrufen müssen.

    
Kirill V. Lyadvinsky 13.10.2009 17:20
quelle
1

Wenn Sie versucht haben, den Funktionszeiger von Prozess A aus Prozess B zu verwenden, würden Sie Prozess A nicht aufrufen - Sie würden anrufen, was an derselben Adresse in Prozess B ist. Wenn sie das gleiche Programm sind, könnten Sie Glück haben und Es wird der gleiche Code sein, aber es wird keinen Zugriff auf die in Prozess A enthaltenen Daten haben.

    
Mark Ransom 13.10.2009 17:22
quelle
1

Ein Funktionszeiger funktioniert dafür nicht, da er nur die Startadresse für den Code enthält; Wenn der betreffende Code in dem anderen Prozess nicht vorhanden ist oder (aufgrund einer Randomisierung des Adressraums) sich an einem anderen Ort befindet, ist der Funktionszeiger nutzlos; im zweiten Prozess wird es auf etwas oder nichts zeigen, aber fast sicher nicht dort, wo du es haben willst.

Sie könnten, wenn Sie wahnsinnig waren, die tatsächliche Befehlssequenz in den gemeinsamen Speicher kopieren und dann direkt in den zweiten Prozess springen lassen. Aber selbst wenn Sie dies zum Laufen bringen könnten, würde die Funktion immer noch in Bearbeitung laufen B, nicht Prozess A.

Es klingt wie das, was Sie wollen, ist eigentlich eine Art Message-Passing oder RPC-System.

    
Jack Lloyd 13.10.2009 17:23
quelle
1

Deshalb haben Leute Dinge wie COM, RPC und CORBA erfunden. Jeder von ihnen gibt diese allgemeine Art von Fähigkeiten. Wie Sie sich denken, macht jeder die Arbeit ein bisschen anders als die anderen.

Boost IPC unterstützt Remote-Prozeduraufrufe nicht wirklich. Es wird ermöglicht, eine Variable im Shared Memory zu platzieren, so dass sie für zwei Prozesse zugänglich ist, aber wenn Sie einen Getter / Setter benutzen wollen, um auf diese Variable zuzugreifen, müssen Sie das selbst tun.

>

Das sind alles Wrapper, um eine "schmackhafte" Version von etwas zu produzieren, das man ohne sie machen kann. In Windows können Sie z. B. eine Variable selbst im Shared Memory ablegen. Sie können das Gleiche unter Linux tun. Die Boost-Bibliothek ist eine ziemlich "dünne" Bibliothek um diese, mit der Sie den gleichen Code für Windows oder Linux schreiben können, aber nicht versuchen, eine Menge darauf zu bauen. CORBA (für ein Beispiel) ist eine viel dickere Schicht und bietet eine relativ vollständige verteilte Umgebung.

    
Jerry Coffin 13.10.2009 17:39
quelle
0

Wenn beide Prozesse in derselben Anwendung sind, sollte dies funktionieren. Wenn Sie versuchen, Funktionszeiger zwischen Anwendungen zu senden, haben Sie Pech.

Meine ursprüngliche Antwort war korrekt, wenn Sie annehmen, dass ein Prozess und ein Thread dasselbe sind, was sie nicht sind. Die anderen Antworten sind korrekt - verschiedene Prozesse können keine Funktionszeiger (oder irgendwelche anderen Arten von Zeigern) teilen.

    
Graeme Perrow 13.10.2009 17:11
quelle

Tags und Links