mac os x使用Mach获取调试和虚拟内存统计信息

// host_alarm.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <mach/mach.h>
#include <mach/clock.h>

#define OUT_ON_MACH_ERROR(msg, retval) \
    if (kr != KERN_SUCCESS) { mach_error(msg ":" , kr); goto out; }

// Structure for the IPC message we will receive from the clock
typedef struct msg_format_recv_s {
    mach_msg_header_t  header;
    int                data;
    mach_msg_trailer_t trailer;
} msg_format_recv_t;

int
main()
{
    kern_return_t     kr;
    clock_serv_t      clk_system;
    mach_timespec_t   alarm_time;
    clock_reply_t     alarm_port;
    struct timeval    t1, t2;
    msg_format_recv_t message;
    mach_port_t       mytask;

    // The C library optimized this call by returning the task port's value
    // that it caches in the mach_task_self_ variable
    mytask = mach_task_self();

    kr = host_get_clock_service(mach_host_self(), SYSTEM_CLOCK,
                                (clock_serv_t *)&clk_system);
    OUT_ON_MACH_ERROR("host_get_clock_service", kr);

    // Let us set the alarm to ring after 2.5 seconds
    alarm_time.tv_sec = 2;
    alarm_time.tv_nsec = 500;

    // Allocate a port (specifically, get receive right for the new port)
    // We will use this port to receive the alarm message from the clock
    kr = mach_port_allocate(
             mytask,                  // the task acquiring the port right
             MACH_PORT_RIGHT_RECEIVE, // type of right
             &alarm_port);            // task's name for the port right
    OUT_ON_MACH_ERROR("mach_port_allocate", kr);

    gettimeofday(&t1, NULL);

    // Set the alarm
    kr = clock_alarm(clk_system,    // the clock to use
                     TIME_RELATIVE, // how to interpret alarm time
                     alarm_time,    // the alarm time
                     alarm_port);   // this port will receive the alarm message
    OUT_ON_MACH_ERROR("clock_alarm", kr);

    printf("Current time %ld s + %d us\n"
           "Setting alarm to ring after %d s + %d ns\n",
           t1.tv_sec, t1.tv_usec, alarm_time.tv_sec, alarm_time.tv_nsec);

    // Wait to receive the alarm message (we will block here)
    kr = mach_msg(&(message.header),       // the message buffer
                  MACH_RCV_MSG,            // message option bits
                  0,                       // send size (we are receiving, so 0)
                  message.header.msgh_size,// receive limit
                  alarm_port,              // receive right
                  MACH_MSG_TIMEOUT_NONE,   // no timeout
                  MACH_PORT_NULL);         // no timeout notification port
    // We should have received an alarm message at this point
    gettimeofday(&t2, NULL);
    OUT_ON_MACH_ERROR("mach_msg", kr);

    if (t2.tv_usec < t1.tv_usec) {
        t1.tv_sec += 1;
        t1.tv_usec -= 1000000;
    }

    printf("\nCurrent time %ld s + %d us\n", t2.tv_sec, t2.tv_usec);
    printf("Alarm rang after %ld s + %d us\n", (t2.tv_sec - t1.tv_sec),
          (t2.tv_usec - t1.tv_usec));

out:
    mach_port_deallocate(mytask, clk_system);

    // Release user reference for the receive right we created
    mach_port_deallocate(mytask, alarm_port);

    exit(0);
}

mac os x使用Mach获取调试和虚拟内存统计信息


haidragondeMacBook-Air:6-4 haidragon$ ls
host_statistics.c
haidragondeMacBook-Air:6-4 haidragon$ gcc -Wall -o host_statistics host_statistics.c 
host_statistics.c:83:51: warning: format specifies type 'unsigned int' but the argument has type
      'vm_size_t' (aka 'unsigned long') [-Wformat]
    printf("  page size            = %u bytes\n", page_size);
                                     ~~           ^~~~~~~~~
                                     %lu
1 warning generated.
haidragondeMacBook-Air:6-4 haidragon$ ls
host_statistics     host_statistics.c
haidragondeMacBook-Air:6-4 haidragon$ ./host_statistics
Host statistics:
Host load statistics
  time period (sec)     5        30        60
  load average       3652      3840      3894
  Mach factor        1432      1137      1035

Cumulative CPU load statistics
  User state ticks     = 1982520
  System state ticks   = 1584434
  Nice state ticks     = 0
  Idle state ticks     = 4682452

Virtual memory statistics
  page size            = 4096 bytes
  pages free           = 37787
  pages active         = 743035
  pages inactive       = 741807
  pages wired down     = 394144
  zero fill pages      = 75376370
  pages reactivated    = 298997
  pageins              = 2638736
  pageouts             = 16703
  translation faults   = 604768506
  copy-on-write faults = 92497463
  object cache lookups = 0
  object cache hits    = 0 (hit rate nan %)
haidragondeMacBook-Air:6-4 haidragon$ 
``

猜你喜欢

转载自blog.51cto.com/haidragon/2416423