嵌入式学习笔记总结Day22

今天主要学习了c语言中关于时间的获取,以及对文件属性的获取

一、获取时间

1.time
函数原型:time_t time(time_t *tloc);
功能:
返回1970-1-1到现在的秒数(格林威治时间)
参数:
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);
功能:
将本地时间转换为秒数

二、文件属性的获取

在c语言中对文件属性的获取主要是通过stat函数实现,注意另外还有一个lstat函数,其返回值与参数与stat完全一致,但有一点不同:在读取一个链接文件时,stat读取的是链接文件指向的文件,而lstat读取的是链接文件本身。
以下是函数原型;
int stat(const char *pathname, struct stat *statbuf);
功能:
将pathname对应的文件信息放入statbuf中
参数:
pathname:文件路径字符串的首地址
statbuf:存放文件信息空间的首地址
返回值:
成功返回0
失败返回-1
其中,struct stat结构体成员有:

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
    };

我们在使用stat函数后,就可以通过访问struct stat结构体中的成员来查询我们想要查询的文件相关属性。这样我们就可以通过stat函数来实现 ls -l 的指令;
在实现的过程中我们还会用到以下的函数:
1.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 */
    };

2.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 */
    };

3.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 

以下是通过stat函数接口简单实现 ls -l 指令的功能:

#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] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
	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;
	}

	switch (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;
	}
	
	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);   //通过getpwuid实现对文件创建者信息的打印
	if (NULL == pwd)
	{
		printf(" %d", buf.st_uid);
	}
	else 
	{
		printf(" %s", pwd->pw_name);
	}
	
	grp = getgrgid(buf.st_gid);   //通过getgrgid函数实现对文件创建者同组成员的信息进行打印
	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;
}

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值