2011-09-07 13 views

Odpowiedz

22

Użyj getpwuid() i getgrgid().

#include <pwd.h> 
#include <grp.h> 
#include <sys/stat.h> 

struct stat info; 
stat(filename, &info); // Error check omitted 
struct passwd *pw = getpwuid(info.st_uid); 
struct group *gr = getgrgid(info.st_gid); 

// If pw != 0, pw->pw_name contains the user name 
// If gr != 0, gr->gr_name contains the group name 
+3

Dla uzupełnienia należy zwrócić uwagę, że * "getpwnam() i getpwuid() przeszukują bazę danych haseł odpowiednio dla podanej nazwy użytkownika lub użytkownika, ** zawsze zwracając pierwszą napotkaną **" * (podkreślenia dodane), ponieważ jeden UID może być powiązany z więcej niż jedną nazwą użytkownika (myślę, że jest to ogólnie mile widziane). – dmckee

+0

Rzetelny komentarz. Jednym z zakazów mojego życia jest to, że lokalny plik grupy ma wiele wpisów dla GID 1234 o różnych nazwach. Ma na myśli 'getgrent()', aby sprawdzić, czy użytkownik 'jdoe' jest rzeczywiście członkiem grupy 1234. –

3

Jednym ze sposobów byłoby użyć stat() uzyskać UID pliku, a następnie getpwuid() aby uzyskać nazwę użytkownika jako ciąg znaków.