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

时间获取:

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript中手动实现Array.prototype.map方法

在前端开发中&#xff0c;我们经常需要对数组进行操作和处理。在JavaScript中&#xff0c;数组是常用的数据类型之一。而数组的map方法可以将一个数组中的每个元素都进行某种操作&#xff0c;并返回一个新的数组。今天&#xff0c;我们就来手动实现JavaScript中数组原型的map方…

System Verilog浅学——1.二进制和运算符

材料来源&#xff1a;B站up:Tan-Yifan 【SystemVerilog常用语法简介】https://www.bilibili.com/video/BV1XA41177of?p14&vd_source1a46c7af8e528520d93f15dd5c760634 二进制 常量 格式&#xff1a;二进制位宽进制符号&#xff08;b:2;h:16;d:10&#xff09;数据 1b1 …

linux 安装、删除 JTAG驱动

安装 安装驱动需要sudo访问权限&#xff0c;所以得手动安装。 在petalinux安装目录下&#xff1a; 文件的路径。 cd tools/xsct/data/xicom/cable_drivers/lin64/install_script/install_drivers 然后执行文件 install_drivers。 sudo ./install_drivers安装成功。 删除 …

智慧城市驿站:智慧公厕升级版,打造现代化城市生活的便捷配套

随着城市化进程的加速&#xff0c;人们对城市生活质量的要求也越来越高。作为智慧城市建设的一项重要组成部分&#xff0c;多功能城市智慧驿站应运而生。它集合了信息技术、设计美学、结构工艺、系统集成、环保节能等多个亮点&#xff0c;将现代科技与城市生活相融合&#xff0…

【嵌入式】CAN总线

1 简介 CAN 是控制器局域网络 (Controller Area Network) 的简称,它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO11519),是国际上应用最广泛的现场总线之一。 CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线…

用CSS3画一个三角形

<style> .up{width:0;height:0;border: 100px solid transparent;border-top: 100px solid red;/*红色*/ } .down{width:0;height:0;border: 100px solid transparent;border-bottom: 100px solid blue;/*蓝色*/ } .left{width:0;height:0;border: 100px solid transpare…

[C#]winform基于opencvsharp结合CSRNet算法实现低光图像增强黑暗图片变亮变清晰

【算法介绍】 "Conditional Sequential Modulation for Efficient Global Image Retouching" 是一种图像修饰方法&#xff0c;主要用于对图像进行全局的高效调整。该方法基于深度学习技术&#xff0c;通过引入条件向量来实现对图像特征的调制&#xff0c;以达到改善…

全网最 2024 GitHub Copilot超详细免费激活教学-干货

全网最&#x1f525; 2024 GitHub Copilot免费超详细激活教学 尊重原创&#xff0c;编写不易 &#xff0c;帮忙点赞关注一下~转载小伙伴请注明出处&#xff01;谢谢 GitHub Copilot 概述 GitHub Copilot 是由 GitHub 和 OpenAI 合作开发的一款人工智能编程助手。它利用机器…

【Java代码审计】本地命令执行函数

1.本地命令执行函数 在服务器中时常会调用命令执行的代码&#xff0c;以完善或加强系统的功能需求&#xff0c;一旦这些调用命令执行的接口被攻击者恶意利用&#xff0c;就会导致服务器沦陷。 在Java中可用于执行系统命令的方式有API有&#xff1a;java.lang.Runtime、java.la…

十、图像像素点的与、或、非、异或操作

项目功能实现&#xff1a;对图片像素点进行与或非操作 按照之前的博文结构来&#xff0c;这里就不在赘述了 在OpenCV中&#xff0c;颜色是(B,G,R)通道排列 一、头文件 yuhuofei.h 定义一个YUHUOFEI类&#xff0c;里面声明了一个yuhuofei方法 #pragma once#include<openc…

【XR806开发板试用】+移植rosserial到XR806

1 XR806简介 板子来源于极术社区的试用&#xff0c;XR806的在线网址 其主要参数&#xff1a; 主控XR806AF2LDDRSIP 288KB SRAM存储SIP 160KB Code ROM. SIP 16Mbit Flash.天线板载WiFi/BT双天线&#xff0c;可共存按键reboot按键 1&#xff0c;功能按键 1灯红色电源指示灯 1…

【计算机考研】408系统学习法

计算机专业课基本上都是数据结构&#xff0c;计算机组成原理&#xff0c;计算机网络和操作系统中的内容 如果你考的学校是自命题&#xff0c;那么考察的专业课一般比较少&#xff0c;只有1-3门&#xff0c;比较顶尖的学校自命题考的比408还要难。如果考的是408&#xff0c;那么…