Ich nehme C auf, um einige Teile eines großen Python-Projekts zu beschleunigen. Um einem kontinuierlich laufenden Python-Skript neue Funktionen hinzuzufügen, habe ich gelegentlich eine .py-Datei überprüft und deren Inhalt integriert. Ich habe mich gefragt, ob es eine Möglichkeit gäbe, das Äquivalent in C zu machen. Gibt es eine Möglichkeit, den Inhalt einer dynamischen Bibliothek im Handumdrehen aufzunehmen?In C, ist es möglich, neuen Code in einen laufenden Prozess durch Neukompilieren einer dynamischen Bibliothek zu integrieren?
Antwort
Ja, Sie müssen dlopen
verwenden, um auf die Bibliothek zuzugreifen, anstatt zur Kompilierungszeit zu verknüpfen, und dann dlsym
, um auf die darin enthaltenen Funktionen zuzugreifen. Um zu einer neuen Bibliothek zu wechseln, müssen Sie dlclose
das Handle und erstellen Sie eine neue - das Umwickeln dieses in einem Modul, um alle davon zu behandeln ist keine sehr schwierige Aufgabe.
Die Verwendung von 'dclose' in einem laufenden Prozess kann schwierig sein. Sie müssen sicherstellen, dass keine Verweise auf die alte Bibliothek vorhanden sind (z. B. ein Zeiger auf eine statische Variable). – ugoren
Es scheint mir erwähnenswert, dass, obwohl Sie eine beliebige lib verknüpfen können und solange Sie wissen, dass der Symbolname einen Verweis auf eine seiner Funktionen erhält, ** Sie ** jetzt ** die Funktionssignatur im Voraus benötigen, wenn Sie möchten um es erfolgreich zu nennen. – alk
Nicht wirklich wahr. Theoretisch könnten Sie eine einzige definierte Funktionssignatur haben, die die Signatur des Rests des Moduls liefert, sowie Anpassungsdaten, die Ihr Ladermodul dann analysiert und verwendet. Es wäre groß und unhandlich, aber du könntest es tun. –
Sie können es in Windows mit LoadLibrary/FreeLibaray Ich bin sicher, es gibt ein Unix-Äquivalent.
- 1. Abrufen einer Liste verwendeter Bibliotheken durch einen laufenden Prozess (UNIX)
- 2. Ein CLR-Host in einen laufenden Prozess einfügen - möglich?
- 3. Ist es möglich, Haskell in einer C-Bibliothek undurchsichtig einzubetten?
- 4. Ist es möglich, C++ - Code zu symbolisieren?
- 5. Töten Sie einen laufenden Prozess in ColdFusion?
- 6. Ist es möglich, einen C++ - Namespace zu allen Symbolen aus einer C-Bibliothek hinzuzufügen?
- 7. Ist es möglich, statische Bibliothek in Visual Studio in dynamische Bibliothek zu verknüpfen?
- 8. Ist es möglich, einen neuen T-SQL-Operator mit CLR-Code in SQL Server zu erstellen?
- 9. Ist es möglich, Eigenschaften aus einer dynamischen Klasse zu entfernen?
- 10. Ist es möglich, NUnit in Visual Studio 2010 zu integrieren?
- 11. Wie kommt man in einen laufenden Prozess?
- 12. Ist es möglich, einen Prozess in einer Java-Anwendung zu beenden?
- 13. Ist es möglich, Jquery mit Eclipse zu integrieren?
- 14. ist es möglich, eine Eigenschaft durch ihren Wert in C#
- 15. Ist es möglich, Jbehave mit testNG zu integrieren?
- 16. Ist es möglich, einen neuen Rekord mit Linsen zu konstruieren?
- 17. Es ist möglich, C89-Code mit C99-Code zu mischen?
- 18. Ist es möglich, die Speichernutzung in einer C# -Anwendung zu verfolgen, ohne einen Profiler zu verwenden?
- 19. Ist es möglich, einen Dienst in einen anderen Dienst zu integrieren und umgekehrt?
- 20. Ist es möglich, einen Konstruktor in C# zu überschreiben?
- 21. Console.WriteLine zu bereits laufenden Prozess
- 22. Ist es möglich, c-code mit Haskell cabal zu packen?
- 23. Ist es möglich, Code in eine Android-Anwendung zu injizieren?
- 24. Erstellen Sie einen neuen, gestoppten Prozess in C
- 25. Ist es möglich, C/C++ in Android Studio zu debuggen?
- 26. programmgesteuert ausführen und einen lang laufenden Batch-Prozess in Python
- 27. Ist es möglich, einen neuen Zeilenumbruch in einer Sprachdatei zu verwenden?
- 28. Ist es für einen Bibliotheksbenutzer möglich, C++ - Ausnahmen zu umgehen?
- 29. Ist es möglich, einen Funktionszeiger auf einen Konstruktor zu definieren?
- 30. Ist es möglich, systemeigenen C++ - Code in Windows Azure auszuführen?
Haben Sie die Verwendung von http://cython.org/ oder http://pypy.org/ in Betracht gezogen, um den Code zu beschleunigen, der beachtet werden muss? – ChrisProsser
@ChrisProsser. Ich hatte über Pypy nachgedacht, aber das war eine gute Ausrede, um C zu lernen. Ich könnte tatsächlich mit Cython gehen, wenn ich ein Handle auf C bekomme. –