将 Mach 端口发送到 Hurd 翻译器的客户端时出现类型错误
Type error sending Mach port to a Hurd translator's client
我写了一个赫德翻译器和一个客户端,试图了解赫德系统。完整来源是 in this repo on github, and I will quote the salient parts here. My message format is described in a mig
interface definition:
routine machoo_msg_send(
receiver: mach_port_t; /* request port */
selector: machoo_selector; /* message selector */
out response: mach_port_send_t /* result */
);
目标是翻译者应该执行选择器中请求的方法,然后用代表该方法产生的 'object' 的端口填写 response
。
我正在按照两个示例尝试进行设置:an example on gnu.org and the password server from the Hurd itself. My server 提供消息实现:
kern_return_t machoo_msg_send(
mach_port_t receiver,
machoo_selector selector,
mach_port_t *response)
{
// for the moment, prove that we're receiving the message
fprintf(stderr, "[%d %s]\n", receiver, selector);
// return self
if (response != NULL)
{
*response = receiver;
}
return ERR_SUCCESS;
}
并且还使用 trivfs
库来处理端口操作。
我的 client 查找文件系统上的端口并向其发送消息:
int main(int argc, char *argv[])
{
mach_port_t null_object;
mach_port_t returned_object;
kern_return_t retVal;
null_object = file_name_lookup("/tmp/null", 0, 0);
printf("null object port: %u\n", null_object);
retVal = machoo_msg_send(null_object, "doNothing", &returned_object);
if (retVal != 0) {
fprintf(stderr, "error sending message: %d\n", retVal);
exit(-1);
}
printf("returned object from [%u doNothing]: %u\n", null_object, returned_object);
return 0;
}
我看到的是:
- 客户端确实从
file_name_lookup
获得了一个端口
- 客户端在端口
上向服务器发送消息
- 服务器正确地对消息进行多路分解并运行我的处理程序
- 客户端收到
MIG_TYPE_ERROR
响应。
由于交互双方的类型匹配(服务器和客户端都使用 MIG 的例程生成),我预计不会出现类型错误。为什么会产生该错误?我该如何解决?
如果我将 'out' 参数类型从 mach_port_t
或 mach_port_send_t
更改为 int
,那么我的消息将被正确发送、解复用、处理和接收。但是,这无法满足我的目标,即让翻译器回复带有端口的消息,客户端可以在该端口上发送另一条消息。
出现类型错误是因为 mach_port_send_t
类型在服务器端是多态的。例程的服务器处理程序获得一个额外的参数,resultPoly
,用于表示如何将发送权转移到客户端。
这个参数没有出现在声明例程的(shared)header中,因为客户端没有收到那个参数;它只是收到一个 mach_port_t
。不要在服务器代码中包含 header,而是自己声明处理程序(及其附加参数)。
我写了一个赫德翻译器和一个客户端,试图了解赫德系统。完整来源是 in this repo on github, and I will quote the salient parts here. My message format is described in a mig
interface definition:
routine machoo_msg_send(
receiver: mach_port_t; /* request port */
selector: machoo_selector; /* message selector */
out response: mach_port_send_t /* result */
);
目标是翻译者应该执行选择器中请求的方法,然后用代表该方法产生的 'object' 的端口填写 response
。
我正在按照两个示例尝试进行设置:an example on gnu.org and the password server from the Hurd itself. My server 提供消息实现:
kern_return_t machoo_msg_send(
mach_port_t receiver,
machoo_selector selector,
mach_port_t *response)
{
// for the moment, prove that we're receiving the message
fprintf(stderr, "[%d %s]\n", receiver, selector);
// return self
if (response != NULL)
{
*response = receiver;
}
return ERR_SUCCESS;
}
并且还使用 trivfs
库来处理端口操作。
我的 client 查找文件系统上的端口并向其发送消息:
int main(int argc, char *argv[])
{
mach_port_t null_object;
mach_port_t returned_object;
kern_return_t retVal;
null_object = file_name_lookup("/tmp/null", 0, 0);
printf("null object port: %u\n", null_object);
retVal = machoo_msg_send(null_object, "doNothing", &returned_object);
if (retVal != 0) {
fprintf(stderr, "error sending message: %d\n", retVal);
exit(-1);
}
printf("returned object from [%u doNothing]: %u\n", null_object, returned_object);
return 0;
}
我看到的是:
- 客户端确实从
file_name_lookup
获得了一个端口
- 客户端在端口 上向服务器发送消息
- 服务器正确地对消息进行多路分解并运行我的处理程序
- 客户端收到
MIG_TYPE_ERROR
响应。
由于交互双方的类型匹配(服务器和客户端都使用 MIG 的例程生成),我预计不会出现类型错误。为什么会产生该错误?我该如何解决?
如果我将 'out' 参数类型从 mach_port_t
或 mach_port_send_t
更改为 int
,那么我的消息将被正确发送、解复用、处理和接收。但是,这无法满足我的目标,即让翻译器回复带有端口的消息,客户端可以在该端口上发送另一条消息。
出现类型错误是因为 mach_port_send_t
类型在服务器端是多态的。例程的服务器处理程序获得一个额外的参数,resultPoly
,用于表示如何将发送权转移到客户端。
这个参数没有出现在声明例程的(shared)header中,因为客户端没有收到那个参数;它只是收到一个 mach_port_t
。不要在服务器代码中包含 header,而是自己声明处理程序(及其附加参数)。