複雑なマッハ メッセージで送信された文字列を受信しようとしています。具体的には、out of line memory(OOL) メッセージです。残念ながら、インターネットや印刷物には、OOL マッハ メッセージのドキュメントや例はほとんどありません。たとえば、http: //www.amazon.com/Mac-OS-Internals-Systems-Approach/dp/0321278542 には、1091 ページに OOL メッセージを送信する部分的な例がありますが、OOL メッセージを受信する例はありません。
mach メッセージを受信してもエラーは発生しません。つまり、mach_msg()
success が返されますが、送信される文字列NULL
は"123456789"
. では、OOL マッハ メッセージで送信されたデータを正しく受信するにはどうすればよいでしょうか。
#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;
struct ool_msg recv_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(MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_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 = (mach_msg_size_t)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);
}
recv_msg.header.msgh_size = sizeof(struct ool_msg);
err = mach_msg(&recv_msg.header, MACH_RCV_LARGE | MACH_RCV_INTERRUPT,
0, sizeof(recv_msg), port,
MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
if(err != KERN_SUCCESS)
{
mach_error("Can't recieve message\n", err);
return (-1);
}
printf("data: %s\n", recv_msg.data.address);
return (0);
}