Ich habe eine Anwendung, in der ich eine neue getpid-Funktion schreiben muss, um die Originalfunktion des Betriebssystems zu ersetzen. Die Implementierung wäre ähnlich wie:
pid_t getpid(void)
{
if (gi_PID != -1)
{
return gi_PID;
}
else
{
// Betriebssystem-Level getpid() Funktion
}
}
Wie kann ich die ursprüngliche getpid() Implementierung des Betriebssystems durch diese Funktion aufrufen?
EDIT: Ich habe Folgendes versucht:
pid_t getpid(void)
{
if (gi_PID != -1)
{
return gi_PID;
}
else
{
return _getpid();
}
}
wie Jonathan vorgeschlagen hat. Dies hat mir die folgenden Fehler bei der Kompilierung mit g++ gegeben:
Bei der Funktion
pid_t getpid()': SerendibPlugin.cpp:882: Fehler:
_getpid' nicht deklariert (erste Verwendung dieser Funktion) SerendibPlugin.cpp:882: Fehler: (Jedes nicht deklarierte Symbol wird nur einmal für jede Funktion gemeldet, in der es erscheint.)
EDIT 2: Ich habe es geschafft, dies zu erreichen, indem ich einen Funktionszeiger verwendet und ihn auf das nächste Folgesymbol mit der ID "getpid" gesetzt habe, indem ich dlsym(RTLD_NEXT, "getpid") verwendet habe.
Hier ist mein Beispielcode:
vi xx.c
"xx.c" 23 Zeilen, 425 Zeichen
#include
#include
#include
#include
#include
using namespace std;
pid_t(*___getpid)();
pid_t getpid(void)
{
cout << "Mein getpid" << endl;
cout << "PID :" << (*___getpid)() << endl;
return (*___getpid)();
}
int main(void)
{
___getpid = (pid_t(*)())dlsym(RTLD_NEXT, "getpid");
pid_t p1 = getpid();
printf("%d \n", (int)p1);
return(0);
}
g++ xx.c -o xout
Mein getpid
PID :7802
7802