私は、OSの元のものと置き換えるために新しいgetpid関数を書く必要があるアプリケーションがあります。実装は次のようになります。getpidを自分の実装に置き換える
pid_t getpid(void)
{
if (gi_PID != -1)
{
return gi_PID;
}
else
{
// OS level getpid() function
}
}
どのように私はこの機能によりOSの元GETPID()の実装を呼び出すことができますか?
編集:私が試した:ジョナサンなど
pid_t getpid(void)
{
if (gi_PID != -1)
{
return gi_PID;
}
else
{
return _getpid();
}
}
を示唆しています。これは++グラムでコンパイルするとき私に次のエラーを与えた:
In function
pid_t getpid()': SerendibPlugin.cpp:882: error:
_getpid' undeclared (first use this function) SerendibPlugin.cpp:882: error: (Each undeclared identifier is reported only once for each function it appears in.)
EDIT 2:私は、これは関数ポインタを使用し、「GETPID」idの次の2番目のシンボルに設定することで仕事を得ることができました、 dlsym(RTLD_NEXT、 "getpid")を使用します。
は、ここに私のサンプルコードです:
vi xx.c
"xx.c" 23 lines, 425 characters
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <iostream>
#include <dlfcn.h>
using namespace std;
pid_t(*___getpid)();
pid_t getpid(void)
{
cout << "My 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);
}
グラム++ xx.c -o XOUT
多くのシステムではMy getpid
PID :7802
7802
この関数を呼び出す他のアプリケーションでその関数をオーバーライドしたいですか?神の愛のために、なぜですか? –
最後の手段。私は他のやり方をしたいと思っていましたが、何もありません。 – Gayan