Linux stat函数和stat命令(3)

3,getgrgid函数:返回/etc/group文件里指定gid的行,把这一行的信息放入结构体group中。虽然返回值是指针,但不需要调用free函数。

#include <sys/types.h> #include <grp.h> struct group *getgrnam(const char *name); struct group *getgrgid(gid_t gid); struct group { char *gr_name; /* group name */ char *gr_passwd; /* group password */ gid_t gr_gid; /* group ID */ char **gr_mem; /* NULL-terminated array of pointers to names of group members */ };

4,localtime函数:传入从stat函数里得到的st_mtim.tv_sec(当前时间到1970.1.1 00:00:00的秒数),得到结构体tm。虽然返回值是指针,但不需要调用free函数。

#include <time.h> struct tm *localtime(const time_t *timep); struct tm { int tm_sec; /* Seconds (0-60) */ int tm_min; /* Minutes (0-59) */ int tm_hour; /* Hours (0-23) */ int tm_mday; /* Day of the month (1-31) */ int tm_mon; /* Month (0-11) */ int tm_year; /* Year - 1900 */ int tm_wday; /* Day of the week (0-6, Sunday = 0) */ int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */ int tm_isdst; /* Daylight saving time */ };

5,lstat函数:stat碰到软链接,会追述到源文件,穿透;lstat并不会穿透。

例子:模仿ls -l 文件

#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h> #include <string.h> #include <pwd.h>//getpwuid #include <stdlib.h> #include <time.h>//localtime #include <grp.h>//getgrgid int main(int argc, char* argv[]){ struct stat sbuf; //stat(argv[1], &sbuf); lstat(argv[1], &sbuf); char str[11] = {0}; memset(str, '-', (sizeof str - 1)); //文件类型 if(S_ISREG(sbuf.st_mode)) str[0] = '-'; if(S_ISDIR(sbuf.st_mode)) str[0] = 'd'; if(S_ISCHR(sbuf.st_mode)) str[0] = 'c'; if(S_ISBLK(sbuf.st_mode)) str[0] = 'b'; if(S_ISFIFO(sbuf.st_mode)) str[0] = 'p'; if(S_ISLNK(sbuf.st_mode)) str[0] = 'l'; if(S_ISSOCK(sbuf.st_mode)) str[0] = 's'; //本用户的文件权限 if(sbuf.st_mode & S_IRUSR) str[1] = 'r'; if(sbuf.st_mode & S_IWUSR) str[2] = 'w'; if(sbuf.st_mode & S_IXUSR) str[3] = 'x'; //本用户的组的文件权限 if(sbuf.st_mode & S_IRGRP) str[4] = 'r'; if(sbuf.st_mode & S_IWGRP) str[5] = 'w'; if(sbuf.st_mode & S_IXGRP) str[6] = 'x'; //其他用户的文件权限 if(sbuf.st_mode & S_IROTH) str[7] = 'r'; if(sbuf.st_mode & S_IWOTH) str[8] = 'w'; if(sbuf.st_mode & S_IXOTH) str[9] = 'x'; char ymd[20] = {0}; //取得日期和时间 struct tm* tm = localtime(&sbuf.st_atim.tv_sec); sprintf(ymd, "%2d月 %2d %02d:%02d", tm->tm_mon + 1, tm->tm_mday, tm->tm_hour + 1,tm->tm_sec); //-rw-r--r-- 1 ys ys 134 4月 25 09:21 st2.c printf("%s %ld %s %s %ld %s %s\n", str, sbuf.st_nlink, getpwuid(sbuf.st_uid)->pw_name, getgrgid(sbuf.st_gid)->gr_name, sbuf.st_size, ymd, argv[1]); return 0; }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/cece8045ebccfb7b6acd45f696ad5274.html