嵌入式学习第十九天!(时间获取、文件属性和权限的获取、软链接和硬链接)

时间获取:

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

    /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 pointers
                                    to 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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/398048.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

比特币原生 L2 解决方案 Merlin Chain梅林链科普(bitget wallet)

什么是梅林链&#xff1f; Merlin Chain 是由 Bitmap Tech&#xff08;以前称为 Recursiverse&#xff09;背后的团队开发的比特币第 2 层解决方案。 Merlin Chain 专注于利用比特币的独特属性&#xff0c;旨在释放其未开发的潜力。从技术上来说&#xff0c;梅林链集成了零知识…

Docker Desktop 链接windos 安装的redis和mysql

1.1.先在容器安装项目 2.链接redis和mysql配置 redis和mysql是在windos安装的&#xff0c;使用的是小p管理器安装的 项目链接 DB_DRIVERmysql DB_HOSThost.docker.internal DB_PORT3306 DB_DATABASEyunxc_test DB_USERNAMEyunxc_test DB_PASSWORDtest123456... DB_CHARSETutf…

软件测试进阶自动化测试流程

如果想让测试在公司的项目中发挥出它最大的价值&#xff0c;并不是招两个测试技术高手&#xff0c;或引入几个测试技术&#xff0c;而是测试技术对项目流程的渗透&#xff0c;以及测试流程的改进与完善。虽然&#xff0c;当然测试行业前景乐观&#xff0c;许多中小企业也都在引…

如何在本地服务器部署TeslaMate并远程查看特斯拉汽车数据无需公网ip

文章目录 1. Docker部署TeslaMate2. 本地访问TeslaMate3. Linux安装Cpolar4. 配置TeslaMate公网地址5. 远程访问TeslaMate6. 固定TeslaMate公网地址7. 固定地址访问TeslaMate TeslaMate是一个开源软件&#xff0c;可以通过连接特斯拉账号&#xff0c;记录行驶历史&#xff0c;统…

【递归】:原理、应用与案例解析 ,助你深入理解递归核心思想

递归 1.基础简介 递归在计算机科学中&#xff0c;递归是一种解决计算问题的方法&#xff0c;其中解决方案取决于同一类问题的更小子集 例如 递归遍历环形链表 基本情况&#xff08;Base Case&#xff09;&#xff1a;基本情况是递归函数中最简单的情况&#xff0c;它们通常是递…

蓝桥杯Java组备赛(三)

题目1 不可能算到202320232023的阶乘 只需要算到39的阶乘就够了&#xff08;对阶乘的和S的末9位不再有影响&#xff09; 数字很大需要一边计算一边取模import java.util.Scanner;public class Main {public static void main(String[] args) {// Scanner sc new Scanner(Sys…

释放软件资产的无限潜力:如何通过有效的管理实现价值最大化!

随着数字化时代的加速发展&#xff0c;软件资产已成为企业最重要的资产之一。然而&#xff0c;许多企业并未意识到软件资产管理的重要性&#xff0c;导致软件资产的价值无法得到充分发挥。本文将探讨软件资产管理的重要性&#xff0c;以及如何通过有效的管理实现软件资产价值的…

【小呆的力学笔记】弹塑性力学的初步认知五:初始屈服条件(1)

文章目录 3. 初始屈服条件3.1 两个假设以及屈服条件基本形式3.2 π \pi π平面、Lode参数3.3 屈服曲线的一般特征 3. 初始屈服条件 3.1 两个假设以及屈服条件基本形式 在简单拉伸时&#xff0c;材料的屈服很明确&#xff0c;即 σ > σ s (1) \sigma\gt\sigma_s\tag{1} …

力扣55. 跳跃游戏(动态规划)

Problem: 55. 跳跃游戏 文章目录 题目描述思路复杂度Code 题目描述 思路 我们将问题稍做转换每次求取当前位置可以走到的最远位置&#xff0c;在此基础上我们将最终判断是否能走出整个nums&#xff1b;同时我们要判断中途会不会遇到某个位置是0使得不能继续走下去 复杂度 时间…

040 构造器详解

无参构造器 当一个类未定义任何构造器时&#xff0c;代码编译后会自动生成一个无参构造器&#xff0c;如果只需要无参构造器就可以直接省略定义。 public class Person {public Person(){}String name;int age; }public class Person {String name;int age; }有参构造器 有参…

Qt|大小端数据转换(补充)

Qt|大小端数据转换-CSDN博客 之前这篇文章大小端数据转换如果是小数就会有问题。 第一个方法&#xff1a; template <typename T> static QByteArray toData(const T &value, bool isLittle) {QByteArray data;for (int i 0; i < sizeof(T); i) {int bitOffset…

Appium+Python+pytest自动化测试框架

先简单介绍一下目录&#xff0c;再贴一些代码&#xff0c;代码里有注释 Basic目录下写的是一些公共的方法&#xff0c;Data目录下写的是测试数据&#xff0c;image存的是测试失败截图&#xff0c;Log日志文件&#xff0c;Page测试的定位元素&#xff0c;report测试报告&#x…

【JPCS出版|EI稳定检索】2024年第四届人工智能与工业技术应用国际学术会议(AIITA 2024)

2024年第四届人工智能与工业技术应用国际学术会议&#xff08;AIITA 2024&#xff09; 2024 4th International Conference on Artificial Intelligence and Industrial Technology Applications 2024年4月12日-14日 | 中国广州 大会官网&#xff1a;www.aiita.net 二轮截稿…

查看halcon算子的执行时间

点击这个时钟&#xff0c; 运行程序以后就能看到算子的消耗时间

用连续自然数之和来表达整数

文章目录 题目描述&#xff1a;用连续自然数之和来表达整数输入描述输出描述用例1说明用例2代码运行举例注意&#xff1a;1、sprintf 和 strcat区别2、qsort 题目描述&#xff1a;用连续自然数之和来表达整数 一个整数可以由连续的自然数之和来表示。 给定一个整数&#xff0c…

基于学习的参数化查询优化方法

一、背景介绍 参数化查询是指具有相同模板&#xff0c;且只有谓词绑定参数值不同的一类查询&#xff0c;它们被广泛应用在现代数据库应用程序中。它们存在反复执行动作&#xff0c;这为其性能优化提供了契机。 然而&#xff0c;当前许多商业数据库处理参数化查询的方法仅仅只…

大顶堆、小顶堆

堆 堆堆的维护1.自我初始化代码2.插入时维护时间复杂度 代码如有误欢迎指出 本文是最近在整理排序算法的时候写到堆排序单拎出来写的&#xff0c;目前只有维护代码 堆 堆是一颗完全二叉树&#xff0c;同时保证所有双亲都比自己的孩子大&#xff08;可以相等 堆的维护 使用数…

【无标题】力扣报错:member access within null pointer of type ‘struct ListNode‘

项目场景&#xff1a; 做单链表反转题目&#xff0c;报错&#xff1a;member access within null pointer of type ‘struct ListNode’ 题目链接:LINK 问题描述 我明明在初始化指针时候&#xff0c;已经处理了n2->next情况却依然报错 这个报错提示含义是&#xff1a;大概就…

VNCTF2024misc方向部分wp

文章目录 sqlsharkLearnOpenGLez_msbOnlyLocalSql sqlshark tshark -r sqlshark.pcap -Y "http" -T fields -e frame.len -e http.file_data > data.txt不太像常规的盲注&#xff0c;一次性发送两条很类似的payload&#xff0c;比常规的多了一个least在判断passw…

C语言——从头开始——深入理解指针(1)

一.内存和地址 我们知道计算上CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;是通过地址总线把需要的数据从内存中读取的&#xff0c;后通过数据总线把处理后的数据放回内存中。如下图所示&#xff1a; 计算机把内存划分为⼀个个的内存单元&#xff0c;每…