2011-05-06 4 views
3

이 질문은 인터뷰에서 나에게 질문을 받았다 :HP-UX에서 프로세스가 사용하는 가상 메모리를 찾는 C 프로그램?

  • 내가 그들에게

유닉스 (HP-UX)에서 실행중인 프로세스에 의해 사용되는 가상 메모리를 찾을 수있는 간단한 C 프로그램을 작성 내가 정확히 모르겠습니다뿐만 아니라 같은 몇 가지 아이디어를 내놓았다 :

  • 우리가 getpid 시스템 호출을 사용하여 프로세스 ID를 얻고 stat 함께 사용하고 필요한 출력을 얻을 수있을 수 있습니다
  • 또는 system 함수 호출을 실행할 수 있으며 내부에서 ps과 같은 셸 명령을 사용하여 자세한 정보를 얻을 수 있습니다.

아마도 내가 잘못되었습니다. 아무도 이걸 도와 줄 수 없나요?

답변

0

도움이되지 않습니다 getpid() 사용 -. 그것은 당신에게 아마 당신이 관심있는 것이 아니다 현재 프로세스의 PID를 알려줍니다

stat()이 도움이되지 않습니다 사용 - 그것은 당신에게의 크기를 알려줍니다 파일.

당신은 하나의 주 옵션이 옵션 - 나는 HP-UX에 가장 적합한 모르겠어요.

  1. 당신이 필요로하는 수를 찾기 위해 그에서 /proc 파일 시스템과 정보를 사용하십시오. 내가 액세스 할 수있는 HP-UX 11.23 시스템에는 /proc이 없었으므로 이것이 적절하지 않을 가능성이 있습니다.
  2. ps 명령을 popen()을 통해 실행하고 출력을 구문 분석하십시오. 이 명령은 PID (나는 분명히 희망) 프로세스의 PID가에 관심이있다 ps -lp PID 수 있습니다

빠른 검사가 보여줍니다.

  • AIX, 솔라리스, 리눅스가 (세 분기 구현 of) 파일 시스템 /proc
  • HP-UX 및 MacOS X (및 추론에 의해 다른 BSD 시스템)에는 /proc 파일 시스템이 없습니다.
1

HP 가상 컴퓨터의 HP-UX 버전에서는 pstat_getprocvm 기능을 사용하여 프로세스의 가상 메모리 레이아웃을 알 수 있습니다.

here

#ifdef PS_RSESTACK  /* 11.22 and later */ 
#define LAST_VM_TYPE PS_RSESTACK 
#else    /* prior non-IPF */ 
#define LAST_VM_TYPE PS_GRAPHICS_DMA 
#endif    /* PS_RSESTACK */ 

uint32_t virt_totals[LAST_VM_TYPE + 1]; 
uint32_t phys_totals[LAST_VM_TYPE + 1]; 
uint32_t swap_totals[LAST_VM_TYPE + 1]; 
uint32_t mlock_totals[LAST_VM_TYPE + 1]; 

void print_type(int type) 
{ 
    switch (type) { 
    case PS_USER_AREA: 
     printf(" UAREA "); 
     return; 
    case PS_TEXT: 
     printf(" TEXT "); 
     return; 
    case PS_DATA: 
     printf(" DATA/HEAP "); 
     return; 
    case PS_STACK: 
     printf(" MAIN STACK "); 
     return; 
#ifdef PS_RSESTACK 
     case PS_RSESTACK: 
     printf(" RSE STACK "); 
    return; 
#endif    /* PS_RSESTACK */ 
    case PS_IO: 
     printf(" MEM MAPPED I/O "); 
    return; 
     case PS_SHARED_MEMORY: 
    printf(" SYSV SHMEM "); 
    return; 
    case PS_NULLDEREF: 
    printf(" NULL DEREF "); 
    return; 
    case PS_MMF: 
    printf(" MMAP "); 
    return; 
    case PS_GRAPHICS: 
    case PS_GRAPHICS_DMA: 
     printf(" GRAPHICS SPECIFIC "); 
     return; 
    default: 
     printf(" UNUSED TYPE "); 
    } 
    return; 
} 

int main(int argc, char *argv[]) 
{ 
    int error; 
    struct pst_vm_status pvs; 
    struct pst_status ps; 
    int i, j, k, verbose, get_all; 
    pid_t target; 
    int valid = 0; 
    size_t sys_page_size; 
    int done = 0; 
    size_t count; 
    _T_LONG_T last_pid = -1; 

    verbose = 0; 
    target = 0; 
    get_all = 0; 

    if (argc > 3) { 
     printf("USAGE: %s <-v> \n", argv[0]); 
    } 

    if (argc == 2) { 
     target = atoi(argv[1]); 
    } else if (argc == 3) { 
     verbose = 1; 
     target = atoi(argv[2]); 
    } else { 
     get_all = 1; 
    } 

    sys_page_size = sysconf(_SC_PAGE_SIZE); 

    j = 0; 

    printf("VIRT/PHYS/LOCKED/SWAP summaries in pages.\n"); 
    printf("System page size is %ld or 0x%lx bytes.\n", 
     sys_page_size, sys_page_size); 

    do { 
    if (get_all) { 
     target = j++; 
     count = (size_t) 1; 
    } else { 
     count = 0; 
    } 
    done = (pstat_getproc(&ps, sizeof(struct pst_status), 
        count, target) <= 0); 
    if (done) { 
     break; 
    } 

    if (ps.pst_pid == last_pid) { 
     continue; 
    } 

    last_pid = ps.pst_pid; 

    for (k = 0; k <= LAST_VM_TYPE; k++) { 
     virt_totals[k] = 0; 
     phys_totals[k] = 0; 
     swap_totals[k] = 0; 
     mlock_totals[k] = 0; 
    } 

    i = 0; 
    while (pstat_getprocvm(&pvs, sizeof(struct pst_vm_status), 
        (size_t) ps.pst_pid, i++) > 0) { 

     valid = 1; 

     if (verbose) { 
     printf("Object %d: ", i); 
     print_type(pvs.pst_type); 
     printf(" at VA 0x%lx to VA 0x%lx.\n\t", 
       pvs.pst_vaddr, 
       pvs.pst_vaddr + 
       (pvs.pst_length * sys_page_size) - 1); 
     printf("\tVIRT: %ld \tPHYS: %ld \tLOCKED:" 
       " %ld\tSWAP: %ld \n", 
       pvs.pst_length, pvs.pst_phys_pages, 
       pvs.pst_lockmem, pvs.pst_swap); 
     } 
     virt_totals[pvs.pst_type] += pvs.pst_length; 
     phys_totals[pvs.pst_type] += pvs.pst_phys_pages; 
     swap_totals[pvs.pst_type] += pvs.pst_swap; 
     mlock_totals[pvs.pst_type] += pvs.pst_lockmem; 
    } 

    if (valid) { 
     printf("PID %ld:\n", ps.pst_pid); 
    } 
for (k = 0; k <= LAST_VM_TYPE && valid; k++) { 
     print_type(k); 
     printf(" consumes %ld VIRT, %ld PHYS, %ld LOCKED" 
      " and %ld SWAP.\n", 
      virt_totals[k], phys_totals[k], mlock_totals[k], 
      swap_totals[k]); 
     virt_totals[k] = 0; 
     phys_totals[k] = 0; 
     mlock_totals[k] = 0; 
     swap_totals[k] = 0; 
    } 
    valid = 0; 
    } while (get_all); 

    exit(0); 
찍은
관련 문제