什么是存根例程?

问题描述 投票:15回答:4

关于C,什么是存根例程?同样,一个例子也将不胜感激。

c terminology stub routines
4个回答
20
投票

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


首先,它可以是一个占位符例程,您可以快速开发该例程以测试更高级别的例程,以期稍后替换真实版本。这通常与自顶向下的开发一起使用(先编码更高的级别,然后再逐步研究更详细的内容),可以很简单:

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

或更复杂一点:

// Cycle through values for some variety.
int getCount (void) {
    static 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         |
|  +----------+  |                   +---------------+
|  |  caller  |  |                   | Server        |
|  |----------|  |                   |  +----------+ |
|  | stub_cli |---- (over the wire) --->| stub_svr | |
|  +----------+  |                   |  |----------| |
+----------------+                   |  | function | |
                                     |  +----------+ |
                                     +---------------+

在此示例中,调用者不是在同一程序中调用function,而是调用客户端stub函数(具有与function相同的原型),该函数负责打包信息并获取信息。跨线到另一个过程。

这可以是同一台计算机,也可以是另一台计算机,这并不重要-RPC的优点之一是能够随意移动服务器。

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

然后,实函数完成所需的操作并返回到服务器存根,后者可以打包返回信息并将其传递回客户端存根。

然后,客户端存根将其拆包并将其传递回调用方。


9
投票

这是一个与真实函数具有相同签名的函数,但是它什么都不做,可以像真实函数一样被编译和执行。例如

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

    return 0;
}

这些通常用作占位符,因此可以首先确定整个程序的结构,然后确定详细信息。


0
投票

用C语言的存根代码实际上是调用main(),而不是OS或编译器。


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)让存根执行。

© www.soinside.com 2019 - 2024. All rights reserved.