【问题标题】:Process information in OpenBSDOpenBSD 中的进程信息
【发布时间】:2023-03-23 02:36:01
【问题描述】:

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

【问题讨论】:

    标签: unix process ps openbsd


    【解决方案1】:

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

    【讨论】:

    • 我已经检查了 /usr/src 文件夹,即使它是空的。我还查看了 ps 和 top 命令的源代码,但无法弄清楚如何获取进程信息。
    • 我搜索并发现 /usr/include/sys 目录中存在一个标头 proc.h,它由一个结构 proc 组成,该结构 proc 用于获取正在运行的进程信息。我想我可以利用它来解决我的目的:)
    • @IqbalTariq ps 使用kvm_getprocs();关于 proc.h,它不是 kernel 标头吗? (PS如果带宽不是问题你最好升级一下;4.6已经四年了...)
    • 我已经使用 mount_procfs /proc /proc 命令挂载了 procfs,它显示了类似 procfs 的 linux。现在我的任务是解析 /proc 目录并显示正在运行的进程列表及其 PID,就像 ps 命令一样。有什么想法吗?
    • 我没有安装 OpenBSD -- 更不用说 4.6 -- 但是仅仅查看 mount_procfs(8) 强烈 提出了一个想法......请记住 openbsd人们投入了大量的精力来保持他们的联机帮助页保持良好状态。并且永远不要忘记 BSD 上的 /proc 从未受到赞赏,因此它不是最好的信息来源。
    【解决方案2】:

    您可以使用 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 ;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 2023-03-03
      相关资源
      最近更新 更多