PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Offene Dateien eines Prozesses



Lord Kefir
16-08-2005, 16:43
Hat jemand eine Ahnung, wie ich in C unter Linux an die offenen Dateien herankommen kann, die zu einem bestimmten Prozess gehören?!

Mfg, Lord Kefir

Lord Kefir
16-08-2005, 21:13
Okay - habe beim googeln nichts gefunden und einfach ein wenig herumgefrickelt. Hier mein Ansatz (nicht schön - habe es einfach so runtergerattert):


#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>

#define BUFFER_SIZE 500

/* ----------------------------------------------
function: isnumeric
---------------------------------------------- */
bool
isnumeric (const char *string)
{
short i = 0;
bool result = true;

while (i < strlen (string) && result)
{
if (!isdigit (string[i]))
result = false;
++i;
}

return (result);
}

/* ----------------------------------------------
function: main
---------------------------------------------- */
int
main (int argc, char *argv[])
{
DIR *dir1, *dir2;
struct dirent *dir_info1, *dir_info2;
char filename1[100], filename2[100];
char buffer[BUFFER_SIZE];
struct stat attr;

// /proc öffnen:
if ((dir1 = opendir ("/proc")) == NULL)
{
fprintf (stderr, "Fehler.\n");
exit (1);
}

// alle numerischen Ordner durchgehen:
while ((dir_info1 = readdir (dir1)) != NULL)
{
if (isnumeric (dir_info1->d_name))
{
sprintf (filename1, "/proc/%s/fd/", dir_info1->d_name);
// alle Dateien unter /proc/pid/fd/ prüfen:
if ((dir2 = opendir (filename1)) != NULL)
{
while ((dir_info2 = readdir (dir2)) != NULL)
{
if (isnumeric (dir_info2->d_name))
{
sprintf (filename2, "%s%s", filename1,
dir_info2->d_name);
memset (buffer, 0, BUFFER_SIZE);
readlink (filename2, buffer, BUFFER_SIZE);
if ((stat (buffer, &attr) == 0))
{
if (attr.st_mode & S_IFREG)
{
printf ("%s\n", buffer);
}
}
}
}
closedir (dir2);
}
}
}
closedir (dir1);

return (0);
}



Mfg, Lord Kefir

403
17-08-2005, 10:25
evtl. hilft ein Blick auf die Sourcen von lsof:

http://freshmeat.net/projects/lsof/
http://www.backports.org/debian/dists/stable/lsof/source/

;)

Lord Kefir
17-08-2005, 11:22
Würde ich diesbezüglich nicht unter akuter Faulheit leiden, dann hätte ich dies auch getan ;)

Mfg, Lord Kefir