时间获取:
1. time
time_t time(time_t *tloc);
功能:返回1970-01-01到现在的秒数(格林威治时间)
参数:
tloc:存放秒数空间首地址
返回值:
成功返回秒数
失败返回-1
2. localtime
struct tm *localtime(const time_t *timep);
功能:讲秒数转换为本地时间
参数:
timep:存放秒数空间首地址
返回值:
成功返回结构体时间
失败返回NULL
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 */};
3. mktime
time_t mktime(struct tm *tm);
功能:将本地时间转换为秒数
举例应用:
获得本地当前的时间和秒数
#include <stdio.h>
#include <time.h>int main(void)
{time_t t;struct tm *ptm = NULL;struct tm pmk;time(&t);printf("%ld\n", t);ptm = localtime(&t);printf("%04d-%02d-%02d %02d:%02d:%02d\n", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec);pmk.tm_year = ptm->tm_year;pmk.tm_mon = ptm->tm_mon;pmk.tm_mday = ptm->tm_mday;pmk.tm_hour = ptm->tm_hour;pmk.tm_min = ptm->tm_min;pmk.tm_sec = ptm->tm_sec;t = mktime(&pmk);printf("%ld\n", t);return 0;}
文件属性和权限的获取:
1.stat
int stat(const char *pathname, struct stat *statbuf);
功能:将pathname对应的文件信息放入statbuf中
参数:
pathname:文件路径字符串的首地址
statbuf:存放文件信息空间的首地址
返回值:
成功返回0
失败返回-1
struct stat {dev_t st_dev; /* ID of device containing file */ino_t st_ino; /* Inode number */mode_t st_mode; /* File type and mode */nlink_t st_nlink; /* Number of hard links */uid_t st_uid; /* User ID of owner */gid_t st_gid; /* Group ID of owner */dev_t st_rdev; /* Device ID (if special file) */off_t st_size; /* Total size, in bytes */blksize_t st_blksize; /* Block size for filesystem I/O */blkcnt_t st_blocks; /* Number of 512B blocks allocated *//* Since Linux 2.6, the kernel supports nanosecondprecision for the following timestamp fields.For the details before Linux 2.6, see NOTES. */struct timespec st_atim; /* Time of last access */struct timespec st_mtim; /* Time of last modification */struct timespec st_ctim; /* Time of last status change */#define st_atime st_atim.tv_sec /* Backward compatibility */#define st_mtime st_mtim.tv_sec#define st_ctime st_ctim.tv_sec};
/etc/passwd 口令文件
/etc/group 组信息文件
2. getpwuid
struct passwd *getpwuid(uid_t uid);
功能:通过UID获得对应的用户信息
参数:
uid:用户的ID号
返回值:
成功返回包含用户信息的结构体
失败返回NULL
struct passwd {char *pw_name; /* username */char *pw_passwd; /* user password */uid_t pw_uid; /* user ID */gid_t pw_gid; /* group ID */char *pw_gecos; /* user information */char *pw_dir; /* home directory */char *pw_shell; /* shell program */};
3. getgrgid
struct group *getgrgid(gid_t gid);
功能:通过组ID获得组信息
参数:
gid:组的ID号
返回值:
成功返回包含组信息的结构体
失败返回NULL
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 pointersto names of group members */};
4. readlink
ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);
功能:读取链接文件本身的内容
参数:
pathname:链接文件的路径
buf:存放数据空间首地址
bufsiz:最大存放数据字节数
返回值:
成功返回读到字节个数
失败返回-1
软链接和硬链接:
1. 软链接(符号链接)
通过文件名链接,所有能够看到的连接文件均为软连接文件
ln -s file.txt a.txt
2. 硬链接:
通过文件对应的inode节点链接
ln file.txt b.txt
作业:
1. 编写程序实现ls -l的功能查看当前目录下所有文件的详细信息
#include "head.h"int ListLstat(const char* pdirname);int ListDir(void)
{DIR *dp = NULL;struct dirent *pp = NULL;dp = opendir(".");if(dp == NULL){perror("fail to opendir");return -1;}while(1){pp = readdir(dp);if(pp == NULL){break;}if(*pp->d_name == '.'){continue;}ListLstat(pp->d_name);}closedir(dp);return 0;
}int ListLstat(const char *pdirname)
{struct stat buf;int ret = 0;struct passwd *pwd = NULL;struct group *gid = NULL;struct tm *ptm = NULL;char *mon[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};char linkbuff[1024] = {0};ret = lstat(pdirname, &buf);if(ret == -1){perror("fail to lstat");return -1;}switch(buf.st_mode & S_IFMT){case S_IFBLK: putchar('b');break;case S_IFCHR: putchar('c');break;case S_IFDIR: putchar('d');break;case S_IFREG: putchar('-');break;case S_IFLNK: putchar('l');break;case S_IFSOCK: putchar('s');break;case S_IFIFO: putchar('p');break;}buf.st_mode & S_IRUSR ? putchar('r') : putchar('-');buf.st_mode & S_IWUSR ? putchar('w') : putchar('-');buf.st_mode & S_IXUSR ? putchar('x') : putchar('-');buf.st_mode & S_IRGRP ? putchar('r') : putchar('-');buf.st_mode & S_IWGRP ? putchar('w') : putchar('-');buf.st_mode & S_IXGRP ? putchar('x') : putchar('-');buf.st_mode & S_IROTH ? putchar('r') : putchar('-');buf.st_mode & S_IWOTH ? putchar('w') : putchar('-');buf.st_mode & S_IXOTH ? putchar('x') : putchar('-');printf(" %ld", buf.st_nlink);pwd = getpwuid(buf.st_uid);if(pwd == NULL){printf(" %d", buf.st_uid);}else{printf(" %s", pwd->pw_name);}gid = getgrgid(buf.st_gid);if(gid == NULL){printf(" %d", buf.st_gid);}else{printf(" %s", gid->gr_name);}printf(" %6ld", buf.st_size);ptm = localtime(&buf.st_mtime);printf(" %s %d %d:%d", mon[ptm->tm_mon], ptm->tm_mday, ptm->tm_hour, ptm->tm_min);printf(" %s", pdirname);if(S_ISLNK(buf.st_mode)){readlink(pdirname, linkbuff, sizeof(linkbuff));printf(" -> %s", linkbuff);}printf("\n");return 0;
}int main(void)
{ListDir();return 0;
}