Как получить имя владельца файла в Linux с помощью С++?

Как я могу получить имя владельца и имя группы файла в файловой системе Linux с помощью С++? Вызов stat() дает мне только идентификатор владельца и идентификатор группы, но не фактическое имя.

-rw-r--r--.  1 john devl  3052 Sep  6 18:10 blah.txt

Как я могу программно получить «john» и «devl»?


person Dula    schedule 07.09.2011    source источник


Ответы (2)


Используйте getpwuid() и 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
person Jonathan Leffler    schedule 07.09.2011
comment
Для полноты картины обратите внимание, что getpwnam() и getpwuid() ищут в базе данных паролей заданное имя пользователя или uid пользователя, соответственно, всегда возвращая первое найденное имя (выделение добавлено) потому что один UID может быть связан с более чем одним именем пользователя (хотя это обычно не одобряется). - person dmckee --- ex-moderator kitten; 07.09.2011
comment
Справедливый комментарий. Одно из проклятий моей жизни заключается в том, что в файле локальной группы есть несколько записей для GID 1234 с разными именами. Обычно это означает, что getgrent() нужно выяснить, действительно ли пользователь jdoe является членом группы 1234. - person Jonathan Leffler; 07.09.2011

Один из способов — использовать stat() для получения uid файла, а затем getpwuid(), чтобы получить имя пользователя в виде строки.

person jedwards    schedule 07.09.2011