void mach_init_ports(void) { mach_port_array_t ports; mach_msg_type_number_t ports_count; kern_return_t kr; /* * Find those ports important to every task. */ kr = task_get_special_port(mach_task_self(), TASK_BOOTSTRAP_PORT, &bootstrap_port); if (kr != KERN_SUCCESS) return; kr = mach_ports_lookup(mach_task_self(), &ports, &ports_count); if ((kr != KERN_SUCCESS) || (ports_count < MACH_PORTS_SLOTS_USED)) return; name_server_port = ports[NAME_SERVER_SLOT]; environment_port = ports[ENVIRONMENT_SLOT]; service_port = ports[SERVICE_SLOT]; /* get rid of out-of-line data so brk has a chance of working */ (void) vm_deallocate(mach_task_self(), (vm_offset_t) ports, (vm_size_t) (ports_count * sizeof *ports)); }
int main() { mach_port_t port; kern_return_t err; printf("THE MACH_TASK_SELF IS %d.\n", mach_task_self()); err = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port); if (err != KERN_SUCCESS) { perror("ERROR:COULD NOT ALLOCATE THE PORT.\n"); return ; } printf("THE REGISTER PORT IS %d.\n", port); mach_ports_register(mach_task_self(), &port, 1); send(port, 9999); mach_port_t *recvport; int recv_num; task_get_kernel_port(mach_task_self(),&port); printf("SPECIAL KERNAL PORT IS %d.\n",port); mach_ports_lookup(mach_task_self(), &recvport, &recv_num); int i; for (i = 0; i < recv_num; i++) { printf("THE RECV PORT IS %d.AND THE NUM IS %d.\n", *(recvport + i), recv_num); } return 0; }