unix/linux編程實踐教程:ls命令

1. ls命令比較簡單

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>

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

int main( int argc, char **argv )
{
	if ( argc == 1 )
		do_ls( "." );
	else
		while ( --argc ){
			printf("%s:\n", *++argv );
			do_ls( *argv );
		}

	return 0;
}

void do_ls( char dirname[] )
{
	DIR *dir_ptr;
	struct dirent *direntp;
	if ( ( dir_ptr = opendir( dirname ) ) == NULL )
		fprintf(stderr, "ls1:cannot open %s\n", 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();
	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\n", 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_IROTH ) str[ 7 ] = 'r';
	if ( mode & S_IWOTH ) str[ 8 ] = 'w';
	if ( mode & S_IXOTH ) str[ 9 ] = 'x';
}

#include <pwd.h>
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 <grp.h>
char *gid_to_name( gid_t gid )
{
	struct group *getgrpid(), *grp_ptr;
	static char numstr[ 10 ];
	if ( ( grp_ptr = getgrgid( gid ) ) == NULL ){
		sprintf(numstr, "%d", gid );
		return numstr;
	}
	else{
		return grp_ptr->gr_name;
	}
}
    程序效果和ls命令差不多。


有以下命令並未編寫:

chmod,file,chown, chgrp,finger,touch



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章