我正在尝试在 Mach 上的两个进程之间发送消息(准确地说,这是带有 Mach 微内核的 Debian GNU/Hurd),这是我拥有的代码:
#define _GNU_SOURCE
#include "machheader.h"
void
send_integer( mach_port_t destination, int i )
{
kern_return_t err;
struct integer_message message;
/* (i) Form the message : */
/* (i.a) Fill the header fields : */
message.head.msgh_bits =
MACH_MSGH_BITS_REMOTE(MACH_MSG_TYPE_MAKE_SEND);
message.head.msgh_size = sizeof( struct integer_message );
message.head.msgh_local_port = MACH_PORT_NULL;
message.head.msgh_remote_port = destination;
/* (i.b) Explain the message type ( an integer ) */
message.type.msgt_name = MACH_MSG_TYPE_INTEGER_32;
message.type.msgt_size = 32;
message.type.msgt_number = 1;
message.type.msgt_inline = TRUE;
message.type.msgt_longform = FALSE;
message.type.msgt_deallocate = FALSE;
/* message.type.msgt_unused = 0; */ /* not needed, I think */
/* (i.c) Fill the message with the given integer : */
message.inline_integer = i;
/* (ii) Send the message : */
err = mach_msg( &(message.head), MACH_SEND_MSG,
message.head.msgh_size, 0, MACH_PORT_NULL,
MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL );
/* (iii) Analysis of the error code;
if succes, print and acknowledge message and return */
if( err == MACH_MSG_SUCCESS )
{
printf( "success: the message was queued\n" );
}
else
{
perror( "error: some unexpected error ocurred!\n");
exit(err);
}
return;
}
/* receive_integer is a function that receives an integer from some
mach port; it also hides the complexity of using the mach_msg
primitive to the user.
receive_integer takes two arguments; the port where the message is going
to come from with an integer inside, and a pointer to an integer in where
the integer contained in the mentioned message will be stored.
*/
void
receive_integer( mach_port_t source, int *ip )
{
kern_return_t err;
struct integer_message message;
/* (i) Fill the little thing we know about the message : */
/* message.head.msgh_size = sizeof(struct integer_message ); */
/* (ii) Receive the message : */
err = mach_msg( &(message.head), MACH_RCV_MSG, 0,
message.head.msgh_size, source,
MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL );
if( err == MACH_MSG_SUCCESS )
{
printf( "success: the message was received\n" );
}
else
{
perror( "error: Some unexpected error ocurred\n" );
exit(err);
}
*ip = message.inline_integer;
return;
}
/* main function of the program; it does the following :
(i) allocate a port for receiving a message
(ii) send a message containing an integer;
it uses the send_integer function
(iii) receive the message and display it;
it uses the receive_integer function
(iv) deallocate the port
*/
int
main( void )
{
//int s, r; /* s -> int sent, r -> int received */
//mach_port_t destination;
kern_return_t err;
/* Allocate a port to receive the bootstrap message : */
err = mach_port_allocate( mach_task_self(), MACH_PORT_RIGHT_RECEIVE,
&destination );
if( err != KERN_SUCCESS )
{
perror( "Error : could not allocate any port\n" );
exit(err);
}
if(!fork()){
s=7;
send_integer( destination, s );
}else{
receive_integer( destination, &r );
printf("The received integer is : %d\n", r );
}
mach_port_deallocate( mach_task_self(), destination );
return(r);
}
这是 machheader.h:
#include <mach.h>
#include <stdio.h>
#include <error.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
struct integer_message
{
mach_msg_header_t head;
mach_msg_type_t type;
int inline_integer;
};
int s, r; /* s -> int sent, r -> int received */
mach_port_t destination;
当我运行应用程序时,它给了我:
success: the message was queued
这告诉我消息已成功排队,但停在那里并且不会继续从父进程的队列中读取。任何想法?