zoukankan      html  css  js  c++  java
  • 20145207《信息安全系统设计基础》第十周学习总结

    周五周六两整天一直在弄电脑的虚拟机还有git的问题,真心觉得相对于其他课程来讲,这门课花费的时间真是不成正比。需要查那么多资料,才能勉强把基础看懂。而且git的问题,单单就就我这个而言,我不觉得没被扣分的人会比我用心。我问了超级多的人,单单就我这个电脑来讲,可能不大好解决。实验楼一般也都不git。所以。。唉没话说。。。语句我都知道怎么用,就是我这个传不上去。我用同学的传上去了。我的我再搞吧。心累、

    代码

    #include <stdio.h>

    #include <stdlib.h>

    #include <unistd.h> //read

    #include <sys/types.h>  //open

    #include <sys/stat.h>

    #include <fcntl.h>

    #include <utmp.h>   //utmp

    #include <time.h>   //strftime

    int main()

    {

        struct utmp record;

        int fd;

        int len = sizeof(record);

        struct tm *p;

        time_t t;

        char fortime[40];

        if ( (fd = open(UTMP_FILE, O_RDONLY)) == -1 )

        {

            perror( UTMP_FILE );   

            exit(1);

        }

        while(read(fd,&record,len))

        {

            if(record.ut_type == USER_PROCESS)//只显示类型为USER_PROCESS的一般进程

            {

                printf("%-10.10s",record.ut_user);

                printf("%-10.10s",record.ut_line);

                //以下为对时间的转换操作

                t = record.ut_time;    

                p = localtime(&t);

                strftime(fortime,40,"%F %R",p);

                printf("%12s",fortime);

                if(record.ut_host[0]!='');

                    printf(" (%s)",record.ut_host);

                printf(" ");

            }

        }

       

        if (close(fd) == -1)

        {

            perror( UTMP_FILE );   

            exit(1);

        }

        return 0;

    filesize

    1)代码

    #include <stdio.h>

    #include <sys/stat.h>

    int main()

    {

        struct stat infobuf;          

        if ( stat( "/etc/passwd", &infobuf) == -1 )

            perror("/etc/passwd");

        else

            printf(" The size of /etc/passwd is %d ", infobuf.st_size );

    }

    2)功能

    • 用st_size计算文件的字节数大小。

    fileinfo

    1)代码

    #include <stdio.h>

    #include <sys/types.h>

    #include <sys/stat.h>

    void show_stat_info(char *, struct stat *);

    int main(int argc, char *argv[])

    {

        struct stat info;       

        if (argc>1)

        {

       

            if( stat(argv[1], &info) != -1 ){

                show_stat_info( argv[1], &info );

                return 0;

            }

            else

                perror(argv[1]); 

        }

        return 1;

    }

    void show_stat_info(char *fname, struct stat *buf)

    {

        printf("   mode: %o ", buf->st_mode);        

        printf("  links: %d ", buf->st_nlink);       

        printf("   user: %d ", buf->st_uid);         

        printf("  group: %d ", buf->st_gid);         

        printf("   size: %d ", (int)buf->st_size);        

        printf("modtime: %d ", (int)buf->st_mtime);       

        printf("   name: %s ", fname );              

    }

    2)功能

    #include    <stdio.h>

    #include    <sys/types.h>

    #include    <dirent.h>

    void do_ls(char []);

    int main(int argc, char *argv[])

    {

        /*如果操作数只有1个,表明ls后面没有带参数,默认为当前目录,.表示当前目录。*/

        if ( argc == 1 )

            do_ls( "." );

        /*如果ls后面有参数,就把参数读入argv中。*/

        else

            while ( --argc ){

                printf("%s: ", *++argv );

                do_ls( *argv );

            }

        return 0;

    }

    /*因为ls和dir功能相近,用dir来实现ls*/

    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 )

                printf("%s ", direntp->d_name );

            closedir(dir_ptr);

        }

    }

    • 这个功能用来实现显示文件信息

    mode:st_mode        文件的类型和存取的权限        

    links:st_nlink      连到该文件的硬链接数目,刚建立的文件值为1

    user:st_uid         用户ID

    group:st_gid        组ID         

    size:st_size        文件字节数

    modtime:st_mtime    最后一次修改时间

    name:               输入的文件名

    setechoechostate

    1)代码

    setecho

    #include        <stdio.h>

    #include        <stdlib.h>

    #include        <termios.h>

    #define  oops(s,x) { perror(s); exit(x); }

    int main(int argc, char *argv[])

    {

            struct termios info;

            if (argc == 1) //后面没有带参数的话就不做任何操作,退出

            exit(0);

            if (tcgetattr(0,&info)==-1)//tcgetattr函数用于获取与终端相关的参数。参数fd为终端的文件描述符,返回的结果保存在termios 结构体中,这里fd为0,是标准输入。这句用于读取设备属性

                oops("tcgettattr", 1);

            if ( argv[1][0] == 'y' )//如果运行命令后面的参数第一个字母是“y”,执行“设置打开提示符”的命令

                    info.c_lflag |= ECHO ;/*打开提示符*/

            else//对其它所有的参数都执行“设置隐藏提示符”的命令

                    info.c_lflag &= ~ECHO ;/*隐藏提示符*/

            if ( tcsetattr(0,TCSANOW,&info) == -1 )//将修改后的参数写回设备

                   oops("tcsetattr",2);

       

            return 0;

    }

    echostate

    #include        <stdio.h>

    #include        <stdlib.h>

    #include        <termios.h>

    int main()

    {

            struct termios info;

            int rv;

            rv = tcgetattr( 0, &info );     /* read values from driver      */

            if ( rv == -1 ){

                    perror( "tcgetattr");

                    exit(1);

            }

            if ( info.c_lflag & ECHO )

                    printf(" echo is on , since its bit is 1 ");

            else

                    printf(" echo is OFF, since its bit is 0 ");

            return 0;

    }

    2)功能

    • setecho用来改变输入指令是否可见。
    • 输入y(或是以y开头的一串字符),命令可见

    否则(即输入不以y开头的字符),命令不可见

    • echostate显示输入命令是否可见。
    • echo is on:命令可见

    echo is off:命令不可见

    spwd

    1)代码

    #include    <stdio.h>

    #include    <stdlib.h>

    #include    <string.h>

    #include    <sys/types.h>

    #include    <sys/stat.h>

    #include    <dirent.h>

    ino_t   get_inode(char *);

    void    printpathto(ino_t);

    void    inum_to_name(ino_t , char *, int );

    int main()

    {

        printpathto( get_inode( "." ) );   

        putchar(' ');             

        return 0;

    }

    void printpathto( ino_t this_inode )

    {

        ino_t   my_inode ;

        char    its_name[BUFSIZ];

        if ( get_inode("..") != this_inode )

        {

            chdir( ".." );             

            inum_to_name(this_inode,its_name,BUFSIZ);

            my_inode = get_inode( "." );       

            printpathto( my_inode );       

            printf("/%s", its_name );       

                               

        }

    }

    void inum_to_name(ino_t inode_to_find , char *namebuf, int buflen)

    {

        DIR     *dir_ptr;      

        struct dirent   *direntp;      

        dir_ptr = opendir( "." );

        if ( dir_ptr == NULL ){

            perror( "." );

            exit(1);

        }

        while ( ( direntp = readdir( dir_ptr ) ) != NULL )

            if ( direntp->d_ino == inode_to_find )

            {

                strncpy( namebuf, direntp->d_name, buflen);

                namebuf[buflen-1] = '';  

                closedir( dir_ptr );

                return;

            }

        fprintf(stderr, "error looking for inum %d ", (int) inode_to_find);

        exit(1);

    }

    ino_t get_inode( char *fname )

    {

        struct stat info;

        if ( stat( fname , &info ) == -1 ){

            fprintf(stderr, "Cannot stat ");

            perror(fname);

            exit(1);

        }

        return info.st_ino;

    }

    testioctl

    1)代码

    #include <stdio.h>

    #include <stdlib.h>

    #include <unistd.h>

    #include <sys/ioctl.h>

    int main()

    {

        struct winsize size;

        if( isatty(STDOUT_FILENO) == 0)

            exit(1);

        if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &size) < 0) {

            perror("ioctl TIOCGWINSZ error");

            exit(1);

        }

        printf("%d rows %d columns ", size.ws_row, size.ws_col);

        return 0;

    }

    2)功能

    • 获得终端设备的窗口大小

    cp

    1)代码

    #include        <stdio.h>//标准输入输出

    #include        <stdlib.h>//C标准函数库

    #include        <unistd.h>//Unix类系统定义符号常量

    #include        <fcntl.h>//定义了很多宏和open,fcntl函数原型

    #define BUFFERSIZE      4096//定义存储器容量

    #define COPYMODE        0644//定义复制的长度

    void oops(char *, char *);

    int main(int argc, char *argv[])

    {

        int in_fd, out_fd, n_chars;//三个描述符值

        char buf[BUFFERSIZE];//存储器位置

       

        if (argc != 3) {//检查argc的值是否为三,如果不是,返回标准错误

            fprintf(stderr, "usage: %s source destination ", *argv);

            exit(1);

        }

        /*检查cp的第一个参数,要复制的文件,用open打开,in_fd为open返回的描述符

        如果返回-1,代表打开失败,提示错误*/

        if ((in_fd = open(argv[1], O_RDONLY)) == -1)

            oops("Cannot open ", argv[1]);

        /*检查cp的第二个参数,复制的目的地址,用create在目的地址创建新文件,out_fd为open返回的描述符

        如果返回-1,代表创建失败,提示错误*/

        if ((out_fd = creat(argv[2], COPYMODE)) == -1)

            oops("Cannot creat", argv[2]);

        /*cp指令的动作就是读取一个文件的内容到存储器,在新的地址创建空白文件,再从存储器将内容写入新文件。

        这里判断复制是否成功:

        如果能读取顺利,而读取的位数和写的位数不同,是写错误;

        如果读取失败,是读错误。*/

        while ((n_chars = read(in_fd, buf, BUFFERSIZE)) > 0)

            if (write(out_fd, buf, n_chars) != n_chars)

                oops("Write error to ", argv[2]);

        if (n_chars == -1)

            oops("Read error from ", argv[1]);

        /*这里执行的是关闭文件的动作,in_fd和out_fd两个文件描述符

        所指向的文件只要有一个关闭错误,就提示关闭错误。*/

        if (close(in_fd) == -1 || close(out_fd) == -1)

            oops("Error closing files", "");

    }

    /*这个是用来输出错误信息的函数*

  • 相关阅读:
    对我影响最大的三位导师
    global与nonlocal
    random模块
    time模块
    datetime模块
    sys模块
    os模块
    collection模块
    hashlib模块
    pickle模块
  • 原文地址:https://www.cnblogs.com/20145207lza/p/6081248.html
Copyright © 2011-2022 走看看