时间获取
1.time
time_t time(time_t *tloc);
功能:
返回1907-1-1到现在的秒数(格林威治时间)
参数:
tloc:存放秒数空间的首地址
返回值:
成功返回秒数
失败返回-1
2.localtime
struct tm *localtime(const time_t *timep);
功能:
将秒数转换为本地时间
参数:
time:存放秒数空间的首地址
返回值:
成功返回结构体时间
失败返回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 "head.h"int main(void)
{time_t t = 0;time_t t1 = 0;struct tm *pm = NULL;struct tm stm;stm.tm_year = 2024-1900;stm.tm_mon = 2-1;stm.tm_mday = 20;stm.tm_hour = 11;stm.tm_min = 58;stm.tm_sec = 40;t = mktime(&stm);printf("t=%ld\n",t);time(&t1);pm = localtime(&t1);printf("%04d-%02d-%02d %02d:%02d:%02d\n",pm->tm_year+1900,pm->tm_mon+1,pm->tm_mday,pm->tm_hour,pm->tm_min,pm->tm_sec);printf("t1=%ld\n",t1);return 0;
}
文件属性和权限的获取
1.stat
int stat(const char *pathname, struct stat *statbuf);
int lstat(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 nanosecond
precision 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
};
文件类型:形式1
形式2
文件的执行权限:
/etc/passwd 口令文件
/etc/group 组信息文件
1)打印文件类型
#include "head.h"int main(int argc,const char *argv[])
{struct stat buf;int ret = 0;if (argc != 2){fprintf(stderr,"User:./a.out filename!\n");return -1;}ret = stat(argv[1],&buf);if (ret == -1){perror("fial to stat");return -1;}switch(buf.st_mode & S_IFMT){case S_IFDIR:putchar('d');break;case S_IFREG:putchar('-');break;case S_IFLNK:putchar('l');break;case S_IFBLK:putchar('b');break;case S_IFSOCK:putchar('s');break;case S_IFCHR:putchar('c');break;case S_IFIFO:putchar('p');break;}
#if 0if (S_ISREG(buf.st_mode)){putchar('-');}else if (S_ISDIR(buf.st_mode)){putchar('d'); }else if (S_ISCHR(buf.st_mode)){putchar('c');}else if (S_ISBLK(buf.st_mode)){putchar('b');}else if (S_ISLNK(buf.st_mode)){putchar('l');}else if (S_ISSOCK(buf.st_mode)){putchar('s');}else if (S_ISFIFO(buf.st_mode)){putchar('p');}
#endifputchar('\n');return 0;
}
2).文件权限打印
#include "head.h"int main(int argc,const char *argv[])
{struct stat buf;int ret = 0;if (argc != 2){fprintf(stderr,"User:./a.out filename!\n");return -1;}ret = stat(argv[1],&buf);if (ret == -1){perror("fial to stat");return -1;}switch(buf.st_mode & S_IFMT){case S_IFDIR:putchar('d');break;case S_IFREG:putchar('-');break;case S_IFLNK:putchar('l');break;case S_IFBLK:putchar('b');break;case S_IFSOCK:putchar('s');break;case S_IFCHR:putchar('c');break;case S_IFIFO:putchar('p');break;}
#if 0if (S_ISREG(buf.st_mode)){putchar('-');}else if (S_ISDIR(buf.st_mode)){putchar('d'); }else if (S_ISCHR(buf.st_mode)){putchar('c');}else if (S_ISBLK(buf.st_mode)){putchar('b');}else if (S_ISLNK(buf.st_mode)){putchar('l');}else if (S_ISSOCK(buf.st_mode)){putchar('s');}else if (S_ISFIFO(buf.st_mode)){putchar('p');}
#endifbuf.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('-');putchar('\n');return 0;
}
3).打印硬链接的个数:
printf(" %ld ",buf.st_nlink);
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 pointers
to names of group members */
};
4).打印文件的用户名和组名以及文件的字节大小
struct stat buf;struct passwd *pwd = NULL;struct group *gup = NULL;pwd = getpwuid(buf.st_uid);if (pwd == NULL){printf("%d ",buf.st_uid);}else{printf("%s ",pwd->pw_name);}gup = getgrgid(buf.st_gid);if (gup == NULL){printf("%d ",buf.st_gid);}else{printf("%s ",gup->gr_name);}printf("%ld ",buf.st_size);
5).打印文件更改日期个时间
struct tm *ptm = NULL;char *mon[12] = {"1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"};ptm = localtime(&buf.st_mtime);printf("%s %d %d:%d ",mon[ptm->tm_mon],ptm->tm_mday,ptm->tm_hour,ptm->tm_min);
4.readlink
ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);
功能:
读取链接文件本身的内容
参数:
pathname:链接文件的路径
buf:存放数据空间的首地址
bufsiz:最大存放数据字节数
返回值:
成功返回读到的字节个数
失败返回-1
#include "head.h"int main(int argc, const char *argv[])
{struct stat buf;int ret = 0;struct passwd *pwd = NULL;struct group *grp = NULL;struct tm *ptm = NULL;char *mon[12] = {"1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"};char tmpbuff[1024] = {0};if (argc != 2){fprintf(stderr, "Usage:./a.out filename\n");return -1;}ret = lstat(argv[1], &buf);if (-1 == ret){perror("fail to stat");return -1;}#if 0switch (buf.st_mode & S_IFMT){case S_IFDIR:putchar('d');break;case S_IFREG:putchar('-');break;case S_IFSOCK:putchar('s');break;case S_IFLNK:putchar('l');break;case S_IFBLK:putchar('b');break;case S_IFCHR:putchar('c');break;case S_IFIFO:putchar('p');break;}
#endifif (S_ISREG(buf.st_mode)){putchar('-');}else if (S_ISDIR(buf.st_mode)){putchar('d'); }else if (S_ISCHR(buf.st_mode)){putchar('c');}else if (S_ISBLK(buf.st_mode)){putchar('b');}else if (S_ISLNK(buf.st_mode)){putchar('l');}else if (S_ISSOCK(buf.st_mode)){putchar('s');}else if (S_ISFIFO(buf.st_mode)){putchar('p');}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 (NULL == pwd){printf(" %d", buf.st_uid);}else {printf(" %s", pwd->pw_name);}grp = getgrgid(buf.st_gid);if (NULL == grp){printf(" %d", buf.st_gid);}else {printf(" %s", grp->gr_name);}printf(" %ld", 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", argv[1]);if (S_ISLNK(buf.st_mode)){readlink(argv[1], tmpbuff, sizeof(tmpbuff));printf(" -> %s", tmpbuff);}putchar('\n');return 0;
}
软链接和硬链接
1.软链接(符号链接)
通过文件名链接,所有能够看到的链接文件均为软链接
过程:
软链接文件名——>inod——>数据块——>链接项的文件名——>inode——>数据块
ln -s 源文件 链接文件
如:ln -s file.txt a.txt
2.硬链接
通过文件对应的inode节点链接
过程:
文件——>inode——>数据块
ln 源文件 链接文件
如:ln file.txt b.txt