Хелп за процеси в Linux/Unix

8 отговора 341 прегледа
#1

Хелп за процеси в Linux/Unix

Въпросът ми е кой са фунциите на С за да направя листинг на всички процеси, като да имам за тях информация най-вече за Pid и име на модула който го е стартирал?
Т.е. нещо което го вади ps, но от мойта си програма.
П.С. Знам че става като извадя оутпут-а на ps в файл, аз питам за друг начин.

Отговор
в отговор на EXODUS #2

Re: Хелп за процеси в Linux/Unix

С opendir, readdir, closedir се разхождаш из /proc обхождайки поддиректориите започващи с цифра...

Отговор
в отговор на l #3

Тоест,

няма универсален (ала POSIX) C интерфейс

Защото съм 99% сигурен, че Linux (ядрото) има k-нещо-си()

Отговор
в отговор на Masklin #4

Re: Тоест,

Не знам за какво к-нещо-си говориш, но мисля, че дори в забозената колекция на системни извиквания (syscalls), няма нищо свързано с намиране на всички процеси. Поне ps и останалите програми от procps четат информацията от /proc.

Какво не му е C на отварянето на директория и четенето на файловете в нея? Иначе си прав, че /proc не е дефиниран POSIX.

Отговор
в отговор на EXODUS #5

Re: Хелп за процеси в Linux/Unix

Za syzhalenie, linux-a otovo bjaga ot POSIX v toja sluchaj
(viziram lipsata na sys/proc.h)
A neshto takova, pone za poluchavane spisyka na procesite, mozhe da e:

#include <unistd.h> /* needed for getpgid() */

#ifdef __LINUX__
#include <linux/threads.h> /* needed for PID_MAX */
#else
#include <sys/proc.h> /* needed for PID_MAX */
#endif

#include <errno.h>
extern int errno;

/* bla-bla-bla-more-program-code */

pid_t getproclist ( pid_t * pidarr )
{
int getpgidres;
pid_t numofprocs; /* number of successfully checked pids */

numofprocs = 0;
for (int i = 0; i <= PID_MAX; i++)
{
getpgidres = getpgid(i);
if ((EPERM == getpgidres) || (ESRCH == getpidres))
{
perror("getproclist: ");
pidarr = 0;
} else {
pidarr = 1;
numofprocs++;
}
}
return numofprocs;
}

/* bla-bla-bla-yet-more-program-code */
int main ( void )
{
pid_t pidarr[PID_MAX+1];
pid_t numofprocs;
/* bla-bla-bla */
numofprocs = getproclist(pidarr);
/* bla-bla-bla */
}

/* ------- END OF CODE SEGMENT -------- */


RTFM!
--sdg
Отговор
в отговор на sdg #6

Re: Хелп за процеси в Linux/Unix

Мдаа нищо лошо няма в четенето на директории ма не сам толкоз запознат с линкса-а .. : Така де по дoлу ми gо казаха ... RTFM ... :) Аз го реализирах с четене на оутпут-а на ps ot фаил, ама ми беше интересно дали няма по културен начин То в Виндовс лесно - едно време преди 2000 е трябвало директно от ntdll а се ползват функции, сега с ToolHelp32 и PSAPI е песен ... :)
@sdg - a как да взема името на модула на пида?


Редактирано от EXODUS на

Отговор
в отговор на sdg #7

Re: Хелп за процеси в Linux/Unix

Не разбирам какво е по-лесното на тази програма от четенето директно от /proc, но както и да е ...

В самата програма има малка (но фатална) грешка -- getpgid връща -1, ако има грешка, а EPERM и ESRCH трябва да се проверяват в errno, а не в резултата. Така е в Линукс и Соларис, така пише и в Single Unix Specification.

Отговор
в отговор на l #8

Re: Хелп за процеси в Linux/Unix

Programata beshe proof-of-concept i RTFM stimulator :-) Bez malkite, no fatalni
greshki, bi bila myrzel stimulator :-)

Za prostotata -- syglasen sym, che chetene na /proc e po-lesno, i do kolkoto
temata e v klub Linux, s /proc neshtata se izcherpvat. Problemyt na /proc e, che
ne e compatible.


RTFM!
--sdg
Отговор
в отговор на sdg #9

Спокойно

Модераторът е програмист и толерира залитания в тази посока

А и темата си е чисто програмистка. Linux, разбира се, е една от най-окуражаващите програмистите среда.

Разглеждането на /proc като интерфейс обаче спокойно може да се приеме като high-level аналог на обикновенните викания на функции. В крайна сметка разликата е само в минаването през парсер ...

Отговор