• 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;
    }
    

  • 相关阅读:
    8.驱动与硬件通信
    11.ok6410之led驱动程序编写
    10.字符设备控制学习
    9.应用程序如何访问驱动
    linux内核打印数据到串口控制台,printk数据不打印问题
    nginx配置-location
    spring-cloud config配置中心
    idea中git stash--解决pull冲突或切换分支问题
    idea中git回退本地仓库版本
    idea中git回退远程仓库版本
  • 原文地址:https://www.cnblogs.com/zyzgl/p/11829920.html
Copyright © 2020-2023  润新知