我是OpenBSD的新手。之前我曾在Linux上工作过。我在寻找目录,我可以找到有关当前正在运行的进程的信息。在Linux中,我们拥有整个列表所在的/ proc目录。但是我在OpenBSD 4.6中找不到类似的设置。我知道有像ps,top和sysctl这样的命令,但是我想通过C代码来获取这些信息。OpenBSD中的进程信息
3
A
回答
2
BSD中的procfs已被弃用或完全删除,对不起。这就是说,通常在/ usr/src下有系统的源代码,所以如果你真的需要,你可以看看它们。 或者你可以浏览他们的网站上,如http://bxr.su/o/bin/ps/ps.c
0
您可以使用sysctl来获得kinfo_proc增加结构的阵列正在运行的进程,这种类型定义:
/usr/include/sys/sysctl.h
顶部命令使用功能名为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 ;
}
}
相关问题
- 1. C#中的进程信息
- 2. 进程的线程信息
- 3. C++ - 进程信息
- 4. NODEJS进程信息
- 5. LINUX中的进程工作集信息
- 6. 转储中的进程信息
- 7. 进程和子进程信息(内存)
- 8. Java WS Synchronize信息进程?
- 9. log4net进程ID信息
- 10. 从android中的进程ID查找进程信息
- 11. 用于OpenBSD的D编程
- 12. 进度信息
- 13. 信息进入
- 14. 获取子进程的异常信息
- 15. 使用/ proc提供守护进程的进程信息
- 16. 进程和子进程之间的DCL信息
- 17. 从另一个进程获取信息
- 18. 获取进程内存信息
- 19. 获取进程信息时System.ArgumentException和System.ComponentModel.Win32Exception
- 20. iOS进程信息(pid,uid,cpu,mem,...)
- 21. 从监控进程获取信息
- 22. EventLog.WriteEntry先进的信息
- 23. 如何使用32位进程查找64位进程信息
- 24. NodeJS:从进程ID获取进程信息
- 25. 从进程句柄获取进程信息
- 26. 在android中的进程的内存信息
- 27. Python中的进程通信
- 28. 基于它的进程名称的Android应用程序信息
- 29. 获取进程中的内存信息C
- 30. 显示主进程控制台中的所有信息
我已经检查过/ usr/src文件夹,甚至是空的。我还查看了ps和top命令的源代码,但无法弄清楚如何获取进程信息。 – iqstatic
我搜索了一下,发现在/ usr/include/sys目录下有一个proc.h头文件,它包含一个结构体proc,它读取正在运行的进程信息。我想我可以利用它来解决我的目的:) – iqstatic
@IqbalTariq ps使用'kvm_getprocs()';关于proc.h,是不是一个**内核**头? (PS如果带宽不是问题,你最好升级; 4.6是四岁......) – loreb