Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix OpenBSD中的进程信息_Unix_Process_Ps_Openbsd - Fatal编程技术网

Unix OpenBSD中的进程信息

Unix OpenBSD中的进程信息,unix,process,ps,openbsd,Unix,Process,Ps,Openbsd,我是OpenBSD的新手。我以前在Linux上工作过。我正在寻找一个目录,在那里我可以找到有关当前正在运行的进程的信息。在Linux中,我们有/proc目录,其中包含整个列表。但是我在OpenBSD4.6中找不到类似的设置。我知道有像ps、top和sysctl这样的命令,但我想通过C代码获得这些信息。BSDs中的procfs要么已被弃用,要么已被完全删除,对不起。 也就是说,在/usr/src下有系统的源代码也是很常见的,因此如果确实需要,您可以查看它们。 或者,您可以在web上浏览它们,例如,

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

BSDs中的procfs要么已被弃用,要么已被完全删除,对不起。 也就是说,在/usr/src下有系统的源代码也是很常见的,因此如果确实需要,您可以查看它们。
或者,您可以在web上浏览它们,例如,您可以使用sysctl获取kinfo_proc结构数组中正在运行的进程,该类型定义如下:

/usr/include/sys/sysctl.h
/usr/src/usr.bin/top/machine.c
top命令使用一个名为getprocs的函数,其工作方式如下所示:

/usr/include/sys/sysctl.h
/usr/src/usr.bin/top/machine.c
下一个实用程序使用稍微修改过的getprocs版本输出所有正在运行的进程的信息:

#包括
#包括
#包括
#包括
#包括
#定义真1
#定义FALSE 0
结构kinfo_proc*getprocs(int*count,int线程)
{
结构kinfo_proc*procbase=NULL;
无符号整数maxslp;
size\u t size=sizeof(maxslp);
int maxslp_mib[]={CTL_VM,VM_maxslp};
int-mib[6]=
{
CTL_KERN,
克努普罗克,
线程?KERN_PROC_KTHREAD | KERN_PROC_SHOW_线程:KERN_PROC_KTHREAD,
0,
sizeof(结构kinfo_proc),
0
} ;
if(sysctl(maxslp_mib,2,&maxslp,&size,NULL,0)=-1)
{
佩罗尔(“名单”);
返回NULL;
}
重试:
if(sysctl(mib,6,NULL,&size,NULL,0)=-1)
{
佩罗尔(“名单”);
返回NULL;
}
尺寸=5*尺寸/4;/*额外坡度*/
procbase=(结构kinfo_proc*)malloc(大小);
if(procbase==NULL)
{
佩罗尔(“名单”);
返回NULL;
}
mib[5]=(int)(大小/大小(struct kinfo_proc));
if(sysctl(mib,6,procbase,&size,NULL,0))
{
if(errno==ENOMEM)
{
免费(procbase);
转到重试;
}
佩罗尔(“名单”);
返回NULL;
}
*计数=(int)(大小/sizeof(struct kinfo_proc));
返回基;
}
int showinfo(int线程)
{
结构kinfo_proc*list,*proc;
int计数,i;
if((list=getprocs(&count,threads))==NULL)
{
返回1;
}
proc=列表;
如果(线程)
{
对于(i=0;ip_tid!=-1)
{
printf(“%s:pid:%d(tid:%d)\n”,proc->p\u comm,proc->p\u pid,proc->p\u tid);
}
}
}
其他的
{
对于(i=0;ip\u comm,proc->p\u pid);
}
}
返回0;
}
int main(int argc,char*argv[])
{
如果(argc==1)
{
返回showinfo(假);
}
else if(argc==2&(!strcmp(argv[1],“-t”)| |!strcmp(argv[1],“-threads”))
{
返回showinfo(TRUE);
}
其他的
{
printf(“用法:\n”);
printf(“列表[-h][t]\n\n”);
printf(“选项:\n”);
printf(“-h,--help打印此信息\n”);
printf(“-t,--threads显示线程\n\n”);
返回0;
}
}

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