首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Mach端口发送到Hurd翻译器的客户端时输入错误

将Mach端口发送到Hurd翻译器的客户端时输入错误
EN

Stack Overflow用户
提问于 2018-01-26 08:13:12
回答 1查看 125关注 0票数 1

我写了一个赫德翻译和一个客户,试图了解赫德系统。完整的源代码是在github的回购中,我将在这里引用显著的部分。我的消息格式在接口定义中描述。

代码语言:javascript
复制
routine machoo_msg_send(
        receiver: mach_port_t; /* request port */
        selector: machoo_selector; /* message selector */
    out response: mach_port_send_t /* result */
);

目的是让翻译人员执行选择器中请求的方法,然后用表示方法产生的“对象”的端口填充response

我下面两个例子来尝试设置:关于gnu.org的一个例子来自Hurd本身的密码服务器。我的服务器提供了消息实现:

代码语言:javascript
复制
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库来处理端口操作。

我的客户端查找文件系统上的端口并向它发送消息:

代码语言:javascript
复制
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. 客户端接收MIG_TYPE_ERROR作为响应。

由于类型在交互的两边匹配(从MIG生成的例程在服务器和客户端都使用),所以我不会期望类型错误。为什么会产生错误,我该如何处理呢?

如果我将'out‘参数类型从mach_port_tmach_port_send_t更改为int,那么我的消息将被正确地发送、分解、执行和接收。但是,这不能满足我的目标,我的目标是让翻译人员回复带有端口的消息,客户端可以在该端口上发送另一条消息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-27 16:53:33

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48457731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档