2013-12-09 4 views
3

Я новичок в OpenBSD. Раньше я работал над Linux. Я ищу каталог, в котором я могу найти информацию о текущих процессах. В Linux у нас есть каталог/proc, где присутствует весь список. Но я не могу найти аналогичную установку в OpenBSD 4.6. Я знаю, что есть команды вроде ps, top и sysctl, но я хочу получить эту информацию с помощью кода C.Информация о процессе в OpenBSD

ответ

2

procfs в BSD либо устарел, либо удален вообще, извините. Это, как правило, также имеет источники для вашей системы под/usr/src, поэтому вы можете посмотреть на них, если вам действительно нужно. Или вы можете просто просматривать их в Интернете, например, http://bxr.su/o/bin/ps/ps.c

+0

Я уже проверил папку/usr/src, и даже это пусто. Я также посмотрел исходный код для команд ps и top, но не смог понять, как извлекается информация о процессе. – iqstatic

+0

Я искал и обнаружил, что в каталоге/usr/include/sys присутствует заголовок proc.h, состоящий из процесса структуры, который извлекает текущую информацию процесса. Я думаю, что могу использовать это, чтобы решить мою задачу :) – iqstatic

+0

@IqbalTariq ps использует 'kvm_getprocs()'; о proc.h, не является ли это ** ядром ** заголовком? (PS, если пропускная способность не является проблемой, вам лучше обновиться, 4.6 - четыре года ...) – loreb

0

Вы можете использовать SYSCTL, чтобы получить запущенные процессы в массиве kinfo_proc структур, этот тип определен в:

/usr/include/sys/sysctl.h 

верхнего использовании команды функция с именем getprocs, который работает таким образом, это определено в:

/usr/src/usr.bin/top/machine.c 

следующая утилита выводит информацию обо всех запущенных процессах, используя слегка модифицированную версию getprocs:

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <kvm.h> 
#include <sys/sysctl.h> 

#define TRUE 1 
#define FALSE 0 

struct kinfo_proc * getprocs(int * count, int threads) 
{ 
    struct kinfo_proc * procbase = NULL ; 
    unsigned int maxslp ; 
    size_t size = sizeof(maxslp) ; 
    int maxslp_mib[] = { CTL_VM, VM_MAXSLP } ; 
    int mib[6] = 
    { 
     CTL_KERN, 
     KERN_PROC, 
     threads ? KERN_PROC_KTHREAD | KERN_PROC_SHOW_THREADS : KERN_PROC_KTHREAD, 
     0, 
     sizeof(struct kinfo_proc), 
     0 
    } ; 

    if(sysctl(maxslp_mib, 2, &maxslp, &size, NULL, 0) == -1) 
    { 
     perror("list") ; 
     return NULL ; 
    } 

    retry: 

    if(sysctl(mib, 6, NULL, &size, NULL, 0) == -1) 
    { 
     perror("list") ; 
     return NULL ; 
    } 

    size = 5 * size/4 ;   /* extra slop */ 
    procbase = (struct kinfo_proc *)malloc(size) ; 
    if(procbase == NULL) 
    { 
     perror("list") ; 
     return NULL ; 
    } 

    mib[5] = (int)(size/sizeof(struct kinfo_proc)) ; 
    if(sysctl(mib, 6, procbase, &size, NULL, 0)) 
    { 
     if(errno == ENOMEM) 
     { 
      free(procbase) ; 
      goto retry; 
     } 
     perror("list") ; 
     return NULL ; 
    } 

    *count = (int)(size/sizeof(struct kinfo_proc)) ; 
    return procbase ; 
} 

int showinfo(int threads) 
{ 
    struct kinfo_proc * list, * proc ; 
    int count, i ; 
    if((list = getprocs(&count, threads)) == NULL) 
    { 
     return 1 ; 
    } 
    proc = list ; 
    if(threads) 
    { 
     for(i = 0 ; i < count ; ++i, ++proc) 
     { 
      if(proc->p_tid != -1) 
      { 
       printf("%s: pid: %d (tid: %d)\n", proc->p_comm, proc->p_pid, proc->p_tid) ; 
      } 
     } 
    } 
    else 
    { 
     for(i = 0 ; i < count ; ++i, ++proc) 
     { 
      printf("%s: pid: %d\n", proc->p_comm, proc->p_pid) ; 
     } 
    } 
    return 0 ; 
} 

int main(int argc, char * argv[]) 
{ 
    if(argc == 1) 
    { 
     return showinfo(FALSE) ; 
    } 
    else if(argc == 2 && (!strcmp(argv[1], "-t") || !strcmp(argv[1], "--threads"))) 
    { 
     return showinfo(TRUE) ; 
    } 
    else 
    { 
     printf("Usage:\n") ; 
     printf("  list [-h] [-t]\n\n") ; 
     printf("Options:\n") ; 
     printf("  -h, --help   Print this information\n") ; 
     printf("  -t, --threads   Show threads\n\n") ; 
     return 0 ; 
    } 
}