如何解决如何在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>
,它是通常定义文件标志的头文件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。