键入错误将Mach端口发送到Hurd转换器的客户端

时间:2018-01-26 08:13:13

标签: ipc mach

我写了一个Hurd翻译和一个客户,试图了解赫德系统。完整的来源是in this repo on github,我将引用这里的重要部分。我的消息格式在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 */
);

目标是翻译人员应该执行选择器中请求的方法,然后使用代表'对象的端口填充response。由该方法产生。

我按照两个示例尝试进行设置:an example on gnu.orgthe password server from the Hurd itself。我的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;
}

我看到的是:

  1. 客户端确实从file_name_lookup
  2. 获得了一个端口
  3. 客户端将消息发送到端口上的服务器
  4. 服务器正确解压缩消息并运行我的处理程序
  5. 客户收到MIG_TYPE_ERROR作为回应。
  6. 由于类型在交互的两边都匹配(MIG的例程生成在服务器和客户端都使用),我不希望出现类型错误。为什么会产生错误,我该怎么做才能解决它?

    如果我改变了' out'参数类型从mach_port_tmach_port_send_tint,然后我的消息被正确发送,解复用,操作和接收。但是,这无法满足我的目标,即让翻译人员回复带有端口的消息,客户端可以在该端口上发送另一条消息。

1 个答案:

答案 0 :(得分:0)

出现类型错误,因为mach_port_send_t类型在服务器端是多态的。例程的服务器处理程序获得一个额外的参数resultPoly,用于表示如何将发送权转移到客户端。

此参数不会出现在声明例程的(共享)标头中,因为客户端没有收到该参数;它只收到一个mach_port_t。不要在服务器代码中包含标头,而是自己声明处理程序(带有附加参数)。