编写程序,实现在Linux环境用程序实现ls-l的命令?求指点迷津,急!
答案:2 悬赏:60 手机版
解决时间 2021-03-28 04:35
- 提问者网友:城市野鹿
- 2021-03-27 16:17
编写程序,实现在Linux环境用程序实现ls-l的命令?求指点迷津,急!
最佳答案
- 五星知识达人网友:鱼忧
- 2021-03-27 17:17
#include
#include
#include
#include
#include
void do_ls(char[]);
void dostat(char *);
void show_file_info( char *, struct stat *);
void mode_to_letters( int , char[] );
char * uid_to_name( uid_t );
char * gid_to_name( gid_t );
main(int ac, char *av[])
{
if( ac == 1 )
do_ls( "." );
else
while( --ac ){
printf("%s:
", *++av);
do_ls( *av );
}
}
void do_ls( char dirname[] )
{
DIR *dir_ptr;
struct dirent *direntp;
if( (dir_ptr = opendir( dirname )) == NULL)
fprintf(stderr, "ls1: cannot open %s
", dirname);
else
{
while( ( direntp = readdir( dir_ptr ) ) != NULL )
dostat( direntp->d_name );
closedir( dir_ptr );
}
}
void dostat( char *filename )
{
struct stat info;
if( stat( filename, &info ) == -1 )
perror( filename );
else
show_file_info( filename, &info );
}
void show_file_info( char *filename, struct stat *info_p )
{
char *uid_to_name(), *ctime(), *gid_to_name(), *filemode();
void mode_to_letters();
char modestr[11];
mode_to_letters( info_p->st_mode, modestr );
printf("%s", modestr );
printf("%4d", (int)info_p->st_nlink);
printf(" %-8s", uid_to_name(info_p->st_uid));
printf("%-8s", gid_to_name(info_p->st_gid));
printf("%8ld ", (long)info_p->st_size);
printf("%.12s ", 4 + ctime(&info_p->st_mtime));
printf("%s
",filename);
}
void mode_to_letters( int mode, char str[] )
{
strcpy(str,"----------");
if( S_ISDIR(mode) ) str[0] = 'd';
if( S_ISCHR(mode) ) str[0] = 'c';
if( S_ISBLK(mode) ) str[0] = 'b';
if(mode & S_IRUSR) str[1] = 'r';
if(mode & S_IWUSR) str[2] = 'w';
if(mode & S_IXUSR) str[3] = 'x';
if(mode & S_IRGRP) str[4] = 'r';
if(mode & S_IWGRP) str[5] = 'w';
if(mode & S_IXGRP) str[6] = 'x';
if(mode & S_IXOTH) str[7] = 'r';
if(mode & S_IXOTH) str[8] = 'w';
if(mode & S_IXOTH) str[9] = 'x';
}
#include
char *uid_to_name( uid_t uid )
{
struct passwd *getpwuid(), *pw_ptr;
static char numstr[10];
if( ( pw_ptr = getpwuid( uid ) ) == NULL ) {
sprintf(numstr, "%d", uid);
return numstr;
}
else
return pw_ptr->pw_name;
}
#include
char *gid_to_name( gid_t gid )
{
struct group *getgrgid(), *grp_ptr;
static char numstr[10];
if( ( grp_ptr = getgrgid(gid) ) == NULL ){
sprintf(numstr, "%d", gid);
return numstr;
}
else
return grp_ptr->gr_name;
}追问有运行结果的截图吗?追答你这种消极的学习态度就不行,代码都给你了,你自己复制到编辑器,然后编译生成可执行文件,着么跑一圈不就知道了么?追问不是,我是想问可以运行和执行的起来吧?
#include
#include
#include
#include
void do_ls(char[]);
void dostat(char *);
void show_file_info( char *, struct stat *);
void mode_to_letters( int , char[] );
char * uid_to_name( uid_t );
char * gid_to_name( gid_t );
main(int ac, char *av[])
{
if( ac == 1 )
do_ls( "." );
else
while( --ac ){
printf("%s:
", *++av);
do_ls( *av );
}
}
void do_ls( char dirname[] )
{
DIR *dir_ptr;
struct dirent *direntp;
if( (dir_ptr = opendir( dirname )) == NULL)
fprintf(stderr, "ls1: cannot open %s
", dirname);
else
{
while( ( direntp = readdir( dir_ptr ) ) != NULL )
dostat( direntp->d_name );
closedir( dir_ptr );
}
}
void dostat( char *filename )
{
struct stat info;
if( stat( filename, &info ) == -1 )
perror( filename );
else
show_file_info( filename, &info );
}
void show_file_info( char *filename, struct stat *info_p )
{
char *uid_to_name(), *ctime(), *gid_to_name(), *filemode();
void mode_to_letters();
char modestr[11];
mode_to_letters( info_p->st_mode, modestr );
printf("%s", modestr );
printf("%4d", (int)info_p->st_nlink);
printf(" %-8s", uid_to_name(info_p->st_uid));
printf("%-8s", gid_to_name(info_p->st_gid));
printf("%8ld ", (long)info_p->st_size);
printf("%.12s ", 4 + ctime(&info_p->st_mtime));
printf("%s
",filename);
}
void mode_to_letters( int mode, char str[] )
{
strcpy(str,"----------");
if( S_ISDIR(mode) ) str[0] = 'd';
if( S_ISCHR(mode) ) str[0] = 'c';
if( S_ISBLK(mode) ) str[0] = 'b';
if(mode & S_IRUSR) str[1] = 'r';
if(mode & S_IWUSR) str[2] = 'w';
if(mode & S_IXUSR) str[3] = 'x';
if(mode & S_IRGRP) str[4] = 'r';
if(mode & S_IWGRP) str[5] = 'w';
if(mode & S_IXGRP) str[6] = 'x';
if(mode & S_IXOTH) str[7] = 'r';
if(mode & S_IXOTH) str[8] = 'w';
if(mode & S_IXOTH) str[9] = 'x';
}
#include
char *uid_to_name( uid_t uid )
{
struct passwd *getpwuid(), *pw_ptr;
static char numstr[10];
if( ( pw_ptr = getpwuid( uid ) ) == NULL ) {
sprintf(numstr, "%d", uid);
return numstr;
}
else
return pw_ptr->pw_name;
}
#include
char *gid_to_name( gid_t gid )
{
struct group *getgrgid(), *grp_ptr;
static char numstr[10];
if( ( grp_ptr = getgrgid(gid) ) == NULL ){
sprintf(numstr, "%d", gid);
return numstr;
}
else
return grp_ptr->gr_name;
}追问有运行结果的截图吗?追答你这种消极的学习态度就不行,代码都给你了,你自己复制到编辑器,然后编译生成可执行文件,着么跑一圈不就知道了么?追问不是,我是想问可以运行和执行的起来吧?
全部回答
- 1楼网友:第四晚心情
- 2021-03-27 17:51
#include
#include
#include
int
main(int argc, char *argv[])
{
DIR*dp;
struct dirent *dirp;
if (argc != 2)
printf("usage: ls directory_name\n");
if ((dp = opendir(argv[1])) == NULL)
printf("can't open %s\n", argv[1]);
while ((dirp = readdir(dp)) != NULL)
printf("%s\n", dirp->d_name);
closedir(dp);
exit(0);
}
#include
#include
int
main(int argc, char *argv[])
{
DIR*dp;
struct dirent *dirp;
if (argc != 2)
printf("usage: ls directory_name\n");
if ((dp = opendir(argv[1])) == NULL)
printf("can't open %s\n", argv[1]);
while ((dirp = readdir(dp)) != NULL)
printf("%s\n", dirp->d_name);
closedir(dp);
exit(0);
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯