Process information in OpenBSD Process information in OpenBSD unix unix

Process information in OpenBSD


procfs in the BSDs is either deprecated or removed altogether, sorry.That being said, it's also quite usual to have the sources for your system under /usr/src, so you can look at them if you really need to.Or you can just browse them on the web, eg http://bxr.su/o/bin/ps/ps.c


You can use sysctl to get the running processes in an array of kinfo_proc structures, this type is defined in:

/usr/include/sys/sysctl.h

The top command uses a function named getprocs that works this way, it's defined in:

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

The next utility outputs information of all running processes using a slightly modified version of getprocs:

#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <kvm.h>#include <sys/sysctl.h>#define TRUE  1#define FALSE 0struct 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 ;    }}