时间获取:time/localtime/mktime、文件属性和权限的获取:stat/readlink

我要成为嵌入式高手之2月20日Linux高编第五天!!

——————————————————————————————————————————

时间获取

1、time

 #include <time.h>

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

#include "head.h"

int main(void)
{
    time_t t;
    struct tm *ptm = NULL;

    time(&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);

    return 0;
}

3、mktime 

time_t mktime(struct tm *tm);

功能:将本地时间转换为秒数

#include "head.h"

int main(void)
{
    time_t t,t1;
    struct tm *ptm = NULL;
    struct tm tmp;

    tmp.tm_year = 2024-1900;
    tmp.tm_mon = 2-1;
    tmp.tm_mday = 20;
    tmp.tm_hour = 11;
    tmp.tm_min = 27;
    tmp.tm_sec = 30;

    t = mktime(&tmp);
    printf("%ld\n",t);
    t -= 86400;

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

    t1 = mktime(ptm);
    printf("%ld\n",t1);

    return 0;
}

 文件属性和权限的获取

1、stat

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

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 */(创建文件的用户id号)
               gid_t     st_gid;               /* Group ID of owner */(组id)
               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
           };

2、文件类型和权限都用st_mode

文件类型:

查看文件类型程序:

#include "head.h"

int main(int argc,const char *argv[])
{
    struct stat buf;
    int ret = 0;

    if (argc != 2)
    {
        fprintf(stderr,"Usage:./a.out filename");
        return -1;
    }

    ret = stat(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_IFSOCK:putchar('s');break;
        case S_IFLNK:putchar('l');break;
        case S_IFREG:putchar('-');break;
        case S_IFBLK:putchar('b');break;
        case S_IFCHR:putchar('c');break;
        case S_IFIFO:putchar('i');break;
    }
    putchar('\n');

    return 0;
}

 

 查看文件类型和权限程序

#include "head.h"

int main(int argc,const char *argv[])
{
    struct stat buf;
    int ret = 0;

    if (argc != 2)
    {
        fprintf(stderr,"Usage:./a.out filename");
        return -1;
    }

    ret = stat(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_IFSOCK:putchar('s');break;
        case S_IFLNK:putchar('l');break;
        case S_IFREG:putchar('-');break;
        case S_IFBLK:putchar('b');break;
        case S_IFCHR:putchar('c');break;
        case S_IFIFO:putchar('i');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('-');

    putchar('\n');

    return 0;
}

 文件权限

3、软链接和硬链接st_nlink:

1)软链接:软链接文件名--->inode--->数据块--->链接向的文件的路径名--->inode--->数据块

        通过文件名链接,所有能够看到的链接文件均为软链接文件

        ln -s file.txt a.txt

2)硬链接:文件名--->inode--->数据块

        通过文件对应的inode节点链接

        ln file.txt b.txt

3)printf(" %ld",buf.st_nlink);        打印链接文件个数

4、用户名st_uid和组名st_gid

1)、getpwuid

#include <sys/types.h>
#include <pwd.h>

struct passwd *getpwuid(uid_t uid);

功能:通过UID获得对应的用户信息

参数:uid:用户的id号

返回值:成功返回包含用户信息的结构体,失败返回NULL;

结构体:

2)getgrgid

#include <sys/types.h>
#include <grp.h>

struct group *getgrgid(gid_t gid);

功能:通过组id获得组信息

参数:gid:组的id号

返回值:成功返回包含组信息的结构体,失败返回NULL

结构体:

#include "head.h"

int main(int argc,const char *argv[])
{
    struct stat buf;
    int ret = 0;
    struct passwd *puid = NULL;
    struct group *pgid = NULL;

    if (argc != 2)
    {
        fprintf(stderr,"Usage:./a.out filename");
        return -1;
    }

    ret = stat(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_IFSOCK:putchar('s');break;
        case S_IFLNK:putchar('l');break;
        case S_IFREG:putchar('-');break;
        case S_IFBLK:putchar('b');break;
        case S_IFCHR:putchar('c');break;
        case S_IFIFO:putchar('i');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);

    puid = getpwuid(buf.st_uid);
    if (NULL == puid)
    {
        printf(" %d",buf.st_uid);
    }else
    {
        printf(" %s",puid->pw_name);
    }

    pgid = getgrgid(buf.st_gid);
    if (NULL == pgid)
    {
        printf(" %d",buf.st_gid);
    }else
    {
        printf(" %s",pgid->gr_name);
    }

    putchar('\n');

    return 0;
}

 5、readlink

#include <unistd.h>

ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);

功能:读取链接文件本身的内容(指向的文件的名字)

参数:

        pathname:链接文件的路径

        buf:存放数据空间的首地址

        bufsize:最大存放

返回值:

        成功返回读到字节个数;

        失败返回-1;

#include "head.h"

int main(int argc,const char *argv[])
{
    struct stat buf;
    int ret = 0;
    struct passwd *puid = NULL;
    struct group *pgid = NULL;
    off_t size;
    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");
        return -1;
    }

    ret = stat(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_IFSOCK:putchar('s');break;
        case S_IFLNK:putchar('l');break;
        case S_IFREG:putchar('-');break;
        case S_IFBLK:putchar('b');break;
        case S_IFCHR:putchar('c');break;
        case S_IFIFO:putchar('i');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);

    puid = getpwuid(buf.st_uid);
    if (NULL == puid)
    {
        printf(" %d",buf.st_uid);
    }else
    {
        printf(" %s",puid->pw_name);
    }

    pgid = getgrgid(buf.st_gid);
    if (NULL == pgid)
    {
        printf(" %d",buf.st_gid);
    }else
    {
        printf(" %s",pgid->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;
}

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值