首页 > 代码库 > 20145207《信息安全系统设计基础》第十周学习总结

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]!=‘\0‘);

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

            printf("\n");

        }

    }

   

    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\n", 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\n", buf->st_mode);        

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

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

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

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

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

    printf("   name: %s\n", 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:\n", *++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\n", dirname);

    else

    {

        /*递归的方式来读取*/

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

            printf("%s\n", 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\n");

        else

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

 

        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(‘\n‘);             

    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] = ‘\0‘;  

            closedir( dir_ptr );

            return;

        }

    fprintf(stderr, "error looking for inum %d\n", (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\n", 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\n", *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", "");

}

 

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

20145207《信息安全系统设计基础》第十周学习总结