动手练习:
(1)自己实现ls命令
#include <dirent.h>
#include <string.h>
int ls(int argc,char * argv[])
{
int i;
for(i = 2;i < argc;i++)
{
DIR * dp;
struct dirent *dirp;
if((dp = opendir(argv[i])) == NULL)
err_sys("can't open %s\n",argv[i]);
else
printf("%s:\n",argv[i]);
while((dirp = readdir(dp)) != NULL)
{
if(dirp->d_name[0] != '.')
printf("%s\t",dirp->d_name);
}
printf("\n");
closedir(dp);
}
return 0;
}
</span>
(2)实现简单的stat语句
#include "apue.h"
#include <unistd.h>
#include <time.h>
int get_stat(int argc,char * argv[])
{
struct stat buf;
char * type;
off_t size;
blkcnt_t blkcount;
blksize_t blksize;
dev_t dev;
dev_t rdev;
ino_t ino;
nlink_t nlink;
uid_t uid;
gid_t gid;
time_t a_time;
time_t m_time;
time_t c_time;
char user[4];
char group[4];
char other[4];
int i;
for(i = 2;i < argc;i++)
{
if(lstat(argv[i],&buf) < 0){
printf("lstat error\n");
return -1;
}
if(S_ISREG(buf.st_mode))
type = "regular";
else if(S_ISDIR(buf.st_mode))
type = "directory";
else if(S_ISCHR(buf.st_mode))
type = "character special";
else if(S_ISBLK(buf.st_mode))
type = "block special";
else if(S_ISFIFO(buf.st_mode))
type = "fifo";
else if(S_ISLNK(buf.st_mode))
type = "symbolic link";
else if(S_ISSOCK(buf.st_mode))
type = "socket";
size = buf.st_size;
blkcount = buf.st_blocks;
blksize = buf.st_blksize;
dev = buf.st_dev;
rdev = buf.st_rdev;
ino = buf.st_ino;
nlink = buf.st_nlink;
uid = buf.st_uid;
gid = buf.st_gid;
a_time = buf.st_atime;
m_time = buf.st_mtime;
c_time = buf.st_ctime;
if(buf.st_mode & S_IRUSR)
user[0] = 'r';
else
user[0] = '-';
if(buf.st_mode & S_IWUSR)
user[1] = 'w';
else
user[1] = '-';
if(buf.st_mode & S_IXUSR)
user[2] = 'x';
else
user[2] = '-';
if(buf.st_mode & S_IRGRP)
group[0] = 'r';
else
group[0] = '-';
if(buf.st_mode & S_IWGRP)
group[1] = 'w';
else
group[1] = '-';
if(buf.st_mode & S_IXGRP)
group[2] = 'x';
else
group[2] = '-';
if(buf.st_mode & S_IROTH)
other[0] = 'r';
else
other[0] = '-';
if(buf.st_mode & S_IWOTH)
other[1] = 'w';
else
other[1] = '-';
if(buf.st_mode & S_IXOTH)
other[2] = 'x';
else
other[2] = '-';
user[3] = '\0';
group[3] = '\0';
other[3] = '\0';
printf("File:%s\n",argv[i]);
printf("Size:%d\n",size);
printf("Blocks:%d\n",blkcount);
printf("blksize:%d\n",blksize);
printf("%s\n",type);
printf("Device:%d\\%d\n",major(dev),minor(dev));
printf("Inode:%d\n",ino);
printf("Links:%d\n",nlink);
printf("Access:%s%s%s\n",user,group,other);
printf("Userid:%d\n",uid);
printf("Groupid:%d\n",gid);
printf("Access Time:%s",ctime(&a_time));
printf("Modify Time:%s",ctime(&m_time));
printf("Change Time:%s",ctime(&c_time));
}
}
程序截图: