首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置复杂的mach消息头

设置复杂的mach消息头
EN

Stack Overflow用户
提问于 2016-03-13 19:30:41
回答 1查看 981关注 0票数 1

我正在尝试设置一条mach消息,用于使用mach发送超出行的字符串。但是,当我试图发送出线消息时,我会得到一个(ipc/send) invalid msg-header错误。

这是消息结构。

代码语言:javascript
复制
struct ool_msg
{
    mach_msg_header_t header;
    mach_msg_body_t body;
    mach_msg_ool_descriptor_t data;
    mach_msg_type_number_t count;
};

我要像这样设置头像。下面的变量msg是一个struct ool_msg

代码语言:javascript
复制
hdr = &(msg.header);
hdr->msgh_bits = MACH_MSGH_BITS_LOCAL(MACH_MSG_TYPE_COPY_SEND);
hdr->msgh_bits |= MACH_MSGH_BITS_COMPLEX;
hdr->msgh_size = sizeof(msg);
hdr->msgh_local_port = MACH_PORT_NULL;
hdr->msgh_remote_port = port;

这就是我如何设置剩下的Mach消息。

代码语言:javascript
复制
msg.body.msgh_descriptor_count = 1;
msg.data.address = string;
msg.data.size = strlen(string) + 1;
msg.data.deallocate = FALSE;
msg.data.copy = MACH_MSG_VIRTUAL_COPY;
msg.data.type = MACH_MSG_OOL_DESCRIPTOR;
msg.count = msg.data.size;

那么,如何正确设置OOL Mach IPC的消息头呢?

编辑

这里有一个程序可以重现我的问题。

代码语言:javascript
复制
#include <stdio.h>
#include <mach/mach.h>

static char *string = "123456789";

struct ool_msg
{
    mach_msg_header_t header;
    mach_msg_body_t body;
    mach_msg_ool_descriptor_t data;
    mach_msg_type_number_t count;
};

int main(void)
{
    kern_return_t err;
    struct ool_msg msg;
    mach_msg_header_t *hdr;
    mach_port_t port = MACH_PORT_NULL;

    err = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port);
    if(err != KERN_SUCCESS)
    {
        mach_error("Can't allocate mach port\n", err);
        return (-1);
    }

    err = mach_port_insert_right(mach_task_self(), port, port,
                                 MACH_MSG_TYPE_MAKE_SEND);
    if(err != KERN_SUCCESS)
    {
        mach_error("Can't insert port right\n", err);
        return (-1);
    }

    hdr = &(msg.header);
    hdr->msgh_bits = MACH_MSGH_BITS_LOCAL(MACH_MSG_TYPE_COPY_SEND);
    hdr->msgh_bits |= MACH_MSGH_BITS_COMPLEX;
    hdr->msgh_size = sizeof(msg);
    hdr->msgh_local_port = MACH_PORT_NULL;
    hdr->msgh_remote_port = port;

    msg.body.msgh_descriptor_count = 1;
    msg.data.address = string;
    msg.data.size = strlen(string) + 1;
    msg.data.deallocate = FALSE;
    msg.data.copy = MACH_MSG_VIRTUAL_COPY;
    msg.data.type = MACH_MSG_OOL_DESCRIPTOR;
    msg.count = msg.data.size;

    err = mach_msg(hdr,
                  MACH_SEND_MSG,
                  hdr->msgh_size,
                  0,
                  MACH_PORT_NULL,
                  MACH_MSG_TIMEOUT_NONE,
                  MACH_PORT_NULL);
    if(err != KERN_SUCCESS)
    {
        mach_error("Can't send mach msg\n", err);
        return (-1);
    }

    return (0);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-13 22:55:36

医生们所述:

MACH_MSGH_BITS_REMOTEMACH_MSGH_BITS_LOCAL宏返回适当的mach_msg_type_name_t值,给定msgh_bits值。MACH_MSGH_BITS宏为msgh_bits构造一个值,给出两个mach_msg_type_name_t值。

因此,在设置MACH_MSGH_BITS宏时,需要使用mach_msg_header_t.msgh_bits宏而不是MACH_MSGH_BITS_LOCAL宏。否则,您将其设置为mach_msg_type_name_t,而不是您想要的msgh_bits

为了澄清,您需要下面的代码来获得您的msgh_bits:

代码语言:javascript
复制
hdr->msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35974754

复制
相关文章

相似问题

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