Хелп за процеси в Linux/Unix
8 отговора
341 прегледа
Хелп за процеси в Linux/Unix
Въпросът ми е кой са фунциите на С за да направя листинг на всички процеси, като да имам за тях информация най-вече за Pid и име на модула който го е стартирал?
Т.е. нещо което го вади ps, но от мойта си програма.
П.С. Знам че става като извадя оутпут-а на ps в файл, аз питам за друг начин.
Т.е. нещо което го вади ps, но от мойта си програма.
П.С. Знам че става като извадя оутпут-а на ps в файл, аз питам за друг начин.
Re: Хелп за процеси в Linux/Unix
С opendir, readdir, closedir се разхождаш из /proc обхождайки поддиректориите започващи с цифра...
Тоест,
няма универсален (ала POSIX) C интерфейс
Защото съм 99% сигурен, че Linux (ядрото) има k-нещо-си()
Защото съм 99% сигурен, че Linux (ядрото) има k-нещо-си()
Re: Тоест,
Не знам за какво к-нещо-си говориш, но мисля, че дори в забозената колекция на системни извиквания (syscalls), няма нищо свързано с намиране на всички процеси. Поне ps и останалите програми от procps четат информацията от /proc.
Какво не му е C на отварянето на директория и четенето на файловете в нея? Иначе си прав, че /proc не е дефиниран POSIX.
Какво не му е C на отварянето на директория и четенето на файловете в нея? Иначе си прав, че /proc не е дефиниран POSIX.
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
(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
Re: Хелп за процеси в Linux/Unix
Мдаа нищо лошо няма в четенето на директории ма не сам толкоз запознат с линкса-а .. : Така де по дoлу ми gо казаха ... RTFM ... :) Аз го реализирах с четене на оутпут-а на ps ot фаил, ама ми беше интересно дали няма по културен начин То в Виндовс лесно - едно време преди 2000 е трябвало директно от ntdll а се ползват функции, сега с ToolHelp32 и PSAPI е песен ... :)
@sdg - a как да взема името на модула на пида?
@sdg - a как да взема името на модула на пида?
Редактирано от EXODUS на
Re: Хелп за процеси в Linux/Unix
Не разбирам какво е по-лесното на тази програма от четенето директно от /proc, но както и да е ...
В самата програма има малка (но фатална) грешка -- getpgid връща -1, ако има грешка, а EPERM и ESRCH трябва да се проверяват в errno, а не в резултата. Така е в Линукс и Соларис, така пише и в Single Unix Specification.
В самата програма има малка (но фатална) грешка -- getpgid връща -1, ако има грешка, а EPERM и ESRCH трябва да се проверяват в errno, а не в резултата. Така е в Линукс и Соларис, така пише и в Single Unix Specification.
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
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
Спокойно
Модераторът е програмист и толерира залитания в тази посока
А и темата си е чисто програмистка. Linux, разбира се, е една от най-окуражаващите програмистите среда.
Разглеждането на /proc като интерфейс обаче спокойно може да се приеме като high-level аналог на обикновенните викания на функции. В крайна сметка разликата е само в минаването през парсер ...
А и темата си е чисто програмистка. Linux, разбира се, е една от най-окуражаващите програмистите среда.
Разглеждането на /proc като интерфейс обаче спокойно може да се приеме като high-level аналог на обикновенните викания на функции. В крайна сметка разликата е само в минаването през парсер ...