我要成为嵌入式高手之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;
}