2018-2019-1 20165325 《信息安全系统设计基础》第八周学习总结

2018-2019-1 20165325 《信息安全系统设计基础》第八周学习总结

一、学习笔记——网络编程

1、三种并发方式

构造并发程序的方法有三种:

  • 进程
  • 线程
  • I/O多路复用

进程:用内核来调用和维护,有独立的虚拟地址空间,显式的进程间通信机制。

线程:运行在一个单一进程上下文中的逻辑流。由内核进行调度,共享同一个虚拟地址空间。

I/O多路复用:应用程序在一个进程的上下文中显式地调度控制流。逻辑流被模型化为状态机。

2、C/S编程模型

客户端和服务器都是进程,C/S编程模型由一个服务器进程和一个或多个客户端进程组成

服务器进程管理某种资源,通过操作这种资源来为它的客户端提供某种服务。基本操作为事务,一个客户端-服务器事务由四步组成:

  • 客户端向服务器发送请求,发起一个事务;
  • 服务器收到请求,操作资源;
  • 服务器给客户端发送一个响应,并等待下一个请求。
  • 客户端收到响应并处理它。

3、线程控制及相关系统调用

在上一次的socket编程中,服务器持续listen,如果有客户端进程请求,服务器父进程就会派生一个子进程来处理新的连接请求。这便存在基于进程的并发编程。

socket编程

线程:运行子进程上下文中的逻辑流

线程与进程的不同:

  • 线程的上下文切换要比进程的上下文切换快得多;
  • 和一个进程相关的线程组成对等,独立于其他线程创建的线程。
  • 主线程和其他线程的区别仅在于它总是进程中第一个运行的线程。
创建线程

pthread create:创建一个新的线程,在新线程的上下文中运行线程例程f。

新线程可以通过pthread _self获得自己的线程ID。

终止线程

一个线程的终止方式:

  • 当顶层的线程例程返回,线程会隐式地终止;
  • pthread_exit:线程显式地终止。

注:如果主线程调用pthread _exit,它会等待所有其他对等线程终止,然后再终止主线程和整个进程。

回收已终止线程的资源

pthread _join:阻塞,直到线程tid终止,回收已终止线程占用的所有存储器资源。

注:pthread _join只能等待一个指定的线程终止。

分离线程
  • 在任何一个时间点上,线程是可结合的或者是分离的。一个可结合的线程能够被其他线程收回其资源和杀死;一个可分离的线程是不能被其他线程回收或杀死的。它的存储器资源在它终止时有系统自动释放。
  • 默认情况下,线程被创建成可结合的,为了避免存储器漏洞,每个可集合的线程都应该要么被其他进程显式的回收,要么通过调用pthread _detach被分离。
初始化线程

pthread _once允许初始化与线程例程相关的状态。once _control变量是一个全局或者静态变量,总是被初始化为PTHREAD _ONCE _INIT

二、Linux实现命令——mypwd

1、pwd命令学习

在Linux中使用man命令查看pwd:

实际操作使用pwd命令:

pwd命令的作用是查看当前所在的工作路径。

2、思路

基本原理:

每个目录下都至少有两个内容‘.’和’..’,其中‘.’代表当前目录,’..’代表父目录。每个目录或文件都有对应的i-节点号。

$ ls -1ia(数字1,不是字母l):查看当前目录下的文件名和对应的i-节点号。

伪代码不会写(写出来不规范,可能只有自己看得懂),思路大概是:

  • 查看本目录的i-节点,找到父目录;
  • 进入父目录,输出其i-节点对应的文件夹名;
  • 循环以上过程直到到达根目录;
注:首先找到的目录是较小的子目录,最后才读取到根目录。但是输出是从根目录开始的。

典型的输入输出逆序问题,一般两种解决方案:一是用栈,二是用递归。

这里我使用递归实现。

判断是否抵达根目录

根目录的‘.’和’..’相同,i-节点号相同。

用到的核心函数
  • stat(char* fname, struct stat* bufp);把文件fname的信息复制到bufp所指结构体里(stat结构体包含了文件的信息,在/user/include/sys/stat.h中可以看到struct stat的成员变量。);
  • readdir(DIR* dir_ptr)读取dir_ptr目录的所有文件和目录,返回值是struct dirent结构体;每次调用都会指向下一个文件,遍历完后返回值为NULL;
  • chdir

3、实现mypwd

代码:

///////////////////////////////////////////
//mypwd.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
void mypwd(ino_t this_inode);
void inum_to_name(ino_t inode_to_find,char* namebuf,int buflen);
ino_t get_inode(char* fname);
//返回文件的i节点
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;
}
void mypwd(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(".");
        mypwd(my_inode);
        printf("/%s",its_name);
    }
}
//找到i节点对应的文件名,并放在字符数组里
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);
    }
    //寻找指定i节点的目录,将目录名复制到namebuf中。
    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 while looking for inum %d : NOT FOUND!\n",(int)inode_to_find);
    exit (1);
}
int main()
{
    //显示路径
    mypwd(get_inode("."));
    putchar('\n');
    return 0;
}

4、测试mypwd

原文地址:https://www.cnblogs.com/maxeysblog/p/10015303.html

时间: 2024-10-05 03:09:21

2018-2019-1 20165325 《信息安全系统设计基础》第八周学习总结的相关文章

信息安全系统设计基础第八周学习总结

第十章 系统级I/O 怎样学习系统编程(利用Linux学习Linux编程) 一.Unix I/O 一个Unix文件就是一个m字节的序列:B0,B1,B2,…,Bk,…,Bm-1 二.打开和关闭文件 1.进程通过调用open函数来打开一个已存在的文件或者创建一个新文件的: Int open(char *filename, int flags, mode_t mode); 2.通过调用close函数关闭一个打开的文件: Int close(int fd); 三.读和写文件 1.分别调用read和wr

信息安全系统设计基础第八周学习总结-吕松鸿

第10章 系统级I/O I/O:在主存和外部设备之间拷贝数据的过程. 10.1Unix I/O 一个Unix文件就是一个m个字节的序列: B0,B1,B2…Bk…B(m-1) 1.所有的输入输出都能以一种统一且一致的方式来执行: (1)打开文件 a.描述符:内核返回一个小的非负整数,它在后续对此文件的所有操作中标识这个文件. b. Unix外壳创建的每个进程开始时都有三个打开的文件:标准输入(描述符为0).标准输出(描述符为1).标准错误(描述符为2). (2)改变当前的文件设置. (3)读写文

信息安全系统设计基础第八周学习笔记

系统级I/O 前言:输入/输出是在主存和外部设备(如磁盘驱动器.终端和网络)之间拷贝数据的过程.输入操作时从I/O设备拷贝数据到主存,而输出操作时从主存拷贝数据到I/O设备. 10.1  Unix I/O 一个Unix文件就是一个m个字节的序列:B0,B1,B2,B3...Bk...Bm-1. 所有的I/O设备,如网络.磁盘盒终端,都被模型化为文件,而所有的输入和输出都被当做对相应的文件的读和写来执行.这是一种应用接口,成为Unix I/O. ①打开文件:一个应用程序通过要求内核打开相应地文件,

20145216 史婧瑶《信息安全系统设计基础》第一周学习总结

20145216 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 Linux基础 1.ls命令 ls或ls .显示是当前目录的内容,这里“.”就是参数,表示当前目录,是缺省的可以省略.我们可以用ls -a .显示当前目录中的所有内容,包括隐藏文件和目录.其中“-a” 就是选项,改变了显示的内容.如图所示: 2.man命令 man命令可以查看帮助文档,如 man man : 若在shell中输入 man+数字+命令/函数 即可以查到相关的命令和函数:若不加数字,那man命令默认从数字较

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

20145311 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 常用的部分命令 CTRL+SHIFT+T:新建标签页,编程时有重要应用: ALT+数字N:终端中切换到第N个标签页,编程时有重要应用: Tab:终端中命令补全,当输入某个命令的开头的一部分后,按下Tab键就可以得到提示或者帮助完成: CTRL+C:中断程序运行 Ctrl+D:键盘输入结束或退出终端 Ctrl+S: 暂定当前程序,暂停后按下任意键恢复运行 Ctrl+A: 将光标移至输入行头,相当于Home键 Ctrl+E

20145216史婧瑶《信息安全系统设计基础》第九周学习总结

20145216史婧瑶<信息安全系统设计基础>第九周学习总结 教材内容总结 第十章 系统级I/O 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程. 第一节 Unix I/O 这一节涉及到操作系统的基本抽象之一--文件.也就是说,所有的I/O设备都被模型化为文件,而所有的输入输出都被当做对相应文件的读/写.相关的执行动作如下: 1.打开文件: 应用程序向内核发出请求→要求内核打开相应的文件→内核返回文件描述符 文件描述符:一个小的非负整数,用来在后续对此文件的所有操作中标识这个文件.有

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

20145311 <信息安全系统设计基础>第二周学习总结 教材学习内容总结 重新学习了一下上周的一部分命令:grep main wyx.c(grep的全文检索功能)ls > ls.txt :ls内容输出到文本find pathname -mtime -n/+nfind -size -n/+n (find的功能还是比较强大) 简单地学习了一下vim编辑器,跟着vimtutor简单地学了一些,在linux bash中使用vim能够极大地提高效率, vim的用法比较多,只学习了其中简单的一部分

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

20145339顿珠达杰<信息安全系统设计基础>第一周学习总结 ◆ Linux是一个操作系统.如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 物理机系统上可以通过使用[Ctrl]+[Alt]+[F1]-[F6]进行终端和图形界面切换,在线实验环境中按下[Ctrl]+[Alt]+[F7]来完成切换.普通意义上的 Shell 就是可以接受用户输入命令的程序,Unix/Linux 操作系统下的 Shell 既是用户交互的界面,也是控制系统的

2017-2018-1 20155228 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155228 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 常见的存储技术 RAM 随机访问存储器(Random-Access Memory, RAM)分为两类:静态的和动态的.静态 RAM(SRAM)比动态RAM(DRAM)更快,但也贵得多.SRAM用来作为高速缓存存储 器,既可以在CPU芯片上,也可以在片下.DRAM用来作为主存以及图形系统的帧缓冲 区.典型地,一个桌面系统的SRAM不会超过几兆字节,但是DRAM却有几百或几千兆 字节. SRAM将每

2017-2018-1 20155332 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155332 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 简单模型中,存储器是一个线性的字节数组.真实模型中,是一个具有不同容量,成本,访问时间的存储层次结构(存储器山) 程序的局部性很重要,对程序性能有很重要的影响. 计算机系统一个基本而持久的思想,如果你理解了系统是如何将数据在存储器层级结构中上下移动,你就可以编写程序,让数据存储在层次结构中较高的地方,从而CPU可以更快的访问到他们. 编写程序实现功能是最简单的,如何让编写的程序拥有最高的性能,例