2013-12-09 24 views
3

我是OpenBSD的新手。之前我曾在Linux上工作过。我在寻找目录,我可以找到有关当前正在运行的进程的信息。在Linux中,我们拥有整个列表所在的/ proc目录。但是我在OpenBSD 4.6中找不到类似的设置。我知道有像ps,top和sysctl这样的命令,但是我想通过C代码来获取这些信息。OpenBSD中的进程信息

回答

2

BSD中的procfs已被弃用或完全删除,对不起。这就是说,通常在/ usr/src下有系统的源代码,所以如果你真的需要,你可以看看它们。 或者你可以浏览他们的网站上,如http://bxr.su/o/bin/ps/ps.c

+0

我已经检查过/ usr/src文件夹,甚至是空的。我还查看了ps和top命令的源代码,但无法弄清楚如何获取进程信息。 – iqstatic

+0

我搜索了一下,发现在/ usr/include/sys目录下有一个proc.h头文件,它包含一个结构体proc,它读取正在运行的进程信息。我想我可以利用它来解决我的目的:) – 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 ; 
    } 
}