如何在freebsd中使用c列出有关进程的信息?

问题描述

我想列出FreeBSD中的所有进程,并且下面有使用kvm的代码,但是它不知道KVM_NO_FILES是什么,我不知道如何解决它。如果还有其他方法,请分享。

#include <stdio.h>
#include <kvm.h>
#include <limits.h>
#include <sys/param.h>
#include <sys/sysctl.h>

int
main(void)
{
    char errbuf[_POSIX2_LINE_MAX];
    kvm_t *kernel = kvm_openfiles(NULL,NULL,KVM_NO_FILES,errbuf);
    int nentries = 0;
    struct kinfo_proc *kinfo = kvm_getprocs(kernel,KERN_PROC_ALL,sizeof(struct kinfo_proc),&nentries);
    int i;
    for (i = 0; i < nentries; ++i) {
        printf("%s\n",kinfo[i].p_comm);
    }
      return 0;
}

我收到此错误:

root@freebsd:- # cc -lkvm main.c 
main.c:11:53: error: use of undeclared identifier 'KVM_NO_FILES' 
kvm_t *kernel = kvm_openfiles(NULL. NULL. NULL,HVM_NO_FILES,errbuf): 
main.c:13:71: error: invalid application of 'sizeof' to an incomplete type 
'struct kinfo_proc' 
...= kvm_getprocs(kernel,HERN_PROC_ALL,&nen... 
/usr/include/kvM.h:72:8: note: forward declaration of 'struct kinfo_proc' 
struct kinfo_proc; 
main.c:18:29: error: subscript of pointer to incomplete type 'struct kinfo_proc' 
printf("Xs\n",kinfolil.p_comm): 
/usr/include/kvM.h:72:8: note: forward declaration of 'struct kinfo_proc' 
struct kinfo_proc; 
3 errors generated. 

解决方法

我希望这能回答您的问题。来自this link的引用:

要使kvm(3)通过sysctl(3)检索数据,请使用NetBSD和OpenBSD KVM_NO_FILES标志,而DragonFly和 FreeBSD将/ dev / null用于 核心文件。否则,kvm(3)尝试通过/ dev / mem和 对于非root用户,这将失败。

此外,man kvm_openfiles页可能会有所帮助:

kvm_open2()和kvm_openfiles()函数提供BSD样式错误 报告。此处,库未打印出错误消息。 而是,应用程序获取与以下内容相对应的错误消息: 使用kvm_geterr()进行的最新kvm库调用(请参阅kvm_geterr(3))。的 如果最近的kvm调用未产生结果,则结果不确定 错误。由于kvm_geterr()需要一个kvm描述符,但是打开 例程在失败时返回NULL,kvm_geterr()不能用于获取 打开失败时出现错误消息。因此,kvm_open2()和kvm_openfiles()将 将任何错误消息放在errbuf参数中。这个缓冲区应该是 _POSIX2_LINE_MAX个大字符(来自)。

,

我也进行了谷歌搜索。我认为这看起来是一个很酷的问题。 las,我没有BSD和OSX内核调用看起来有所不同。

引用https://www.daemon-systems.org/man/kvm_openfiles.3.html

我猜您需要#include <fcntl.h>,它是通常定义文件标志的头文件。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...