2019.11月 课下作业

1.系统调用who代码

#include <stdio.h>
#include <stdlib.h>
#include <utmp.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>

#define SHOWHOST    

void show_time(long timeval){ 
    char format_time[40]; 
        struct tm *cp;  
        cp = localtime(&timeval);  
        strftime(format_time,40,"%F %R",cp);
        printf("%s",format_time);  
}  

int show_info( struct utmp *utbufp )
{
    if(utbufp->ut_type == USER_PROCESS){

    printf("%-8.8s", utbufp->ut_name);  
    printf(" ");                
    printf("%-8.8s", utbufp->ut_line);  
    printf("     ");                
    show_time(utbufp->ut_time); 
    printf(" ");                
#ifdef  SHOWHOST
    printf("(%s)", utbufp->ut_host);    
#endif
    printf("
");               
    }
    return 0;
}
int main()
{
    struct utmp  current_record;    
    int     utmpfd;     
    int     reclen = sizeof(current_record);

    if ( (utmpfd = open(UTMP_FILE, O_RDONLY)) == -1 ){
        perror( UTMP_FILE );    
        exit(1);
    }
    while ( read(utmpfd, &current_record, reclen) == reclen )
        show_info(&current_record);
    close(utmpfd);
    return 0;           
}

实验截图


实现ls -l

#include	<stdio.h>
#include    <string.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:
", *++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
", 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_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 *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;
}

原文地址:https://www.cnblogs.com/zyzgl/p/11829920.html