通过man手册查看stat,使用st_mode获取文件属性
struct stat statbuf;
if(-1== lstat(argv[1],&statbuf))
{
perror("stat");
return -1;
}
switch(statbuf.st_mode & S_IFMT)
{
case S_IFSOCK:
printf("s");
break;
case S_IFLNK:
printf("l");
break;
case S_IFREG:
printf("-");
break;
case S_IFBLK:
printf("b");
break;
case S_IFDIR:
printf("d");
break;
case S_IFCHR:
printf("c");
break;
case S_IFIFO:
printf("p");
break;
}
判断文件模式
int n=8;
while(n>=0)
{
if(statbuf.st_mode & 1<<n)
{
switch(n%3)
{
case 2:
printf("r");
break;
case 1:
printf("w");
break;
case 0:
printf("x");
break;
}
}
else
{
printf("-");
}
n--;
}
硬链接个数、用户名、用户组名
printf(" %ld",statbuf.st_nlink);
struct passwd *u_id=getpwuid(statbuf.st_uid);
printf(" %s",u_id->pw_name);
struct group *g_id=getgrgid(statbuf.st_gid);
printf(" %s",g_id->gr_name);
printf(" %ld",statbuf.st_size);
最后修改时间
struct tm *mod_t=localtime(&statbuf.st_mtim.tv_sec);
printf(" %d年%d月%d日%d时%d分%d秒",mod_t->tm_year+1900,
mod_t->tm_mon+1,
mod_t->tm_mday,
mod_t->tm_hour,
mod_t->tm_min,
mod_t->tm_sec);
文件名、链接文件的目标文件
printf(" %s",argv[1]);
char buf[100]={0};
int ret=readlink(argv[1],buf,sizeof(buf));
if(ret==-1)
{
perror("readlink");
return -1;
}
printf("->%s\n",buf);
测试