我有一个应用程序,需要编写一个新的getpid函数来替换原来的操作系统。实现将类似于:

pid_t getpid(void)
{
    if (gi_PID != -1)
    {
        return gi_PID;
    }
    else
    {
        // OS level getpid() function
    }
}

如何通过此函数调用操作系统的原始getpid()实现?

编辑:我尝试过:
pid_t getpid(void)
{
    if (gi_PID != -1)
    {
        return gi_PID;
    }
    else
    {
        return _getpid();
    }
}

如乔纳森(Jonathan)所建议。使用g++进行编译时,这给了我以下错误:



编辑2:我已经设法通过使用函数指针并将其设置为使用dlsym(RTLD_NEXT,“getpid”)将其设置为ID为“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);
}

g++ xx.c -o xout
My getpid
PID :7802
7802

最佳答案

在许多系统上,您会发现getpid()_getpid()的“弱符号”,可以代替getpid()对其进行调用。

答案的第一个版本提到了__getpid();由于该提法是错误的,因此被迅速删除。

该代码对我来说在Solaris 10(SPARC)上有效-使用C++编译器:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

extern "C" pid_t _getpid();

pid_t getpid(void)
{
    return(-1);
}

int main(void)
{
    pid_t p1 = getpid();
    pid_t p2 = _getpid();
    printf("%d vs %d\n", (int)p1, (int)p2);
    return(0);
}

该代码对我来说在Solaris 10(SPARC)上有效-使用C编译器:
Black JL: cat xx.c
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

pid_t getpid(void)
{
    return(-1);
}

int main(void)
{
    pid_t p1 = getpid();
    pid_t p2 = _getpid();
    printf("%d vs %d\n", (int)p1, (int)p2);
    return(0);
}
Black JL: make xx && ./xx
cc     xx.c   -o xx
"xx.c", line 13: warning: implicit function declaration: _getpid
-1 vs 29808
Black JL:

10-08 09:16