什么是存根例程?

时间:2010-10-27 01:27:54

标签: c terminology stub routines

关于C什么是存根例程?另外一个例子也将非常受欢迎。

4 个答案:

答案 0 :(得分:19)

存根例程可以是(至少)两件事之一。


首先,它可以是一个占位符例程,您可以快速开发以测试更高级别的例程,以便稍后替换真实版本。这通常与自上而下的开发一起使用(首先编写更高级别然后逐步编写更详细的内容)并且可以像下面那样简单:

int getCount (void) { return 7; } // just return fixed value for testing.

或稍微复杂一点:

// Cycle through values for some variety.
int getCount (void) {
    int retvals[] = {2,7,1,8,2,8,1,8,2,8,4,5,9};
    static int pos = -1;
    pos = (pos + 1) % (sizeof (retvals) / sizeof (*retvals));
    return retvals[pos];
}

当然,一旦存根变得足够复杂,你也可以实现真实的东西: - )


其次,它通常用于远程过程调用(RPC)环境。其中的存根用于在一端编组数据并将其传送到另一端的服务器。

RPC需要为客户端和服务器创建存根函数。它与C中的函数原型非常相似,但最终结果略有不同,例如:

+----------------+
| Client         |
|  +----------+  |  +---------------+
|  |   main   |  |  | Server        |
|  |----------|  |  |  +----------+ |
|  | stub_cli |------->| stub_svr | |
|  +----------+  |  |  |----------| |
+----------------+  |  | function | |
                    |  +----------+ |
                    +---------------+

在此示例中,function不是在同一程序中调用main,而是调用客户端存根函数(与function具有相同的原型),该函数负责打包信息并通过电线将其传送到另一个进程。这可能是同一台机器或不同的机器,它并不重要 - RPC的一个优点是能够随意移动服务器。

在服务器中,有一个“监听器”进程,它将接收该信息并将其传递给服务器。服务器的存根接收信息,解压缩并将其传递给实际函数。

然后真正的函数执行它需要的操作并返回到服务器存根,它可以打包返回信息并将其传递回客户端存根。

客户端存根然后解压缩并将其传递回main

答案 1 :(得分:9)

它是一个与真实函数具有相同签名的函数,但它什么都不做,并且可以像真实函数一样编译和执行。 e.g。

int MyStub(char * str)
{
    /* Stub - Does Nothing */

    return 0;
}

这些通常用作占位符,因此可以先计算整个程序结构,然后再计算细节。

答案 2 :(得分:0)

在C语言中,Stub Code实际上调用main(),而不是OS或编译器。

答案 3 :(得分:0)

在C \ C ++中,我们可以在调用另一个函数时将其作为一种安全的机制

void stub(void (*func)(int), int arg) {
   (*func)(arg);
   thread_exit(0);
}

不仅仅调用func的原因是要确保运行完成后,它不会返回存储在堆栈顶部的随机值,尤其是在不调用thread_exit(0)函数的情况下。因此,我们可以返回到存根,然后调用thread_exit(0)func本身不会调用thread_exit(0),请让存根(stub)执行。