Я новичок в OpenBSD. Раньше я работал над Linux. Я ищу каталог, в котором я могу найти информацию о текущих процессах. В Linux у нас есть каталог/proc, где присутствует весь список. Но я не могу найти аналогичную установку в OpenBSD 4.6. Я знаю, что есть команды вроде ps, top и sysctl, но я хочу получить эту информацию с помощью кода C.Информация о процессе в OpenBSD
3
A
ответ
2
procfs в BSD либо устарел, либо удален вообще, извините. Это, как правило, также имеет источники для вашей системы под/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 ;
}
}
Я уже проверил папку/usr/src, и даже это пусто. Я также посмотрел исходный код для команд ps и top, но не смог понять, как извлекается информация о процессе. – iqstatic
Я искал и обнаружил, что в каталоге/usr/include/sys присутствует заголовок proc.h, состоящий из процесса структуры, который извлекает текущую информацию процесса. Я думаю, что могу использовать это, чтобы решить мою задачу :) – iqstatic
@IqbalTariq ps использует 'kvm_getprocs()'; о proc.h, не является ли это ** ядром ** заголовком? (PS, если пропускная способность не является проблемой, вам лучше обновиться, 4.6 - четыре года ...) – loreb