OpenBSD中的流程信息

时间:2013-12-09 08:00:50

标签: unix process ps openbsd

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

2 个答案:

答案 0 :(得分:2)

很抱歉,BSD中的 procfs已被弃用或删除。 话虽如此,在/ usr / src下拥有系统源代码也很常见,所以如果你真的需要,你可以查看它们。 或者您可以在网上浏览它们,例如http://bxr.su/o/bin/ps/ps.c

答案 1 :(得分:0)

您可以使用sysctl在kinfo_proc结构数组中获取正在运行的进程,此类型定义如下:

/usr/include/sys/sysctl.h

top命令使用一个名为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 ;
    }
}