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


一、知识点总结

1、三种并发方式

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

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

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

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

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

2、C/S编程模型

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

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

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

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

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。

二、通过系统调用实现-pwd命令

步骤:

  • 学习 pwd 命令
  • 研究实现 pwd 所需要的系统调用

pwd是将当前的文件目录的绝对路径打印出来,所以要找到一个函数可以返回当前文件目录名。所以在命令行中输入 man -k dir | grep get 得到如下的信息: 

如上图:getwd正是我们所需要的,通过命令输入: man getwd 得到如下信息:

显然, getwd() 函数功是将当前工作目录的绝对路径复制到数组指针buf中。但是以上代码过于简单,所以按照要求:通过操作目录文件来进行实现 pwd 功能。 思路:

  • 1.打开文件目录查看所有目录如果查到当前目录中有两个相同的" ."文件说明已经到了文件根目录,也就是说本目录的i-node与上级目录的i-- node相同。
  • 2.否则进入".."文件目录,并且将上一级件目录名记录添加到数组中
  • 3.直到符合1的条件为止

具体操作:

  • 命令行输入 man -k open | grep dir 找到了符合条件的函数: opendir 。
  • 需要读取目录的信息——输入 man -k read | grep dir ,找到符合条件的函数: readdir
  • 结束需要关闭文件目录流 man -k close | grep dir ,找到符合条件的函数: readdir
  • 通过 man opendir , man readdir,man closedir 等得知各个函数所需的头文件以及函数参数

对于读取文件目录流涉及到一个结构体:

struct dirent{
ino_t d_ino;//文件结点号
off_t d_off;
unsigned short d_reclen;
unsigined char d_type;
char d_name[];//文件名
}

man -k dir | change 查到fchdir函数: change working directory;

man- k dir 查到chdir作用也是change working directory

比较:

意思是:fchdir用的时候会把当前目录作为打开的文件描述符给出(还不明白)

百度之后查到:fchdir函数传入值是指针fd,函数功能是将当先工作目录改变为fd指的getcwd(gwtcwd函数执行会打印当前文件夹,时间关系,最后打印出来的东西是傻还bzd),但可以肯定的是肯定用的是chdir了。

代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h> ino_t get_inode(char*);
void printpathto(ino_t);
void inode_to_name(ino_t,char*,int);
int main()
{
printpathto(get_inode(".")); //print path to here
putchar('\n');
return ;
} void printpathto(ino_t this_inode)
{
ino_t my_inode;
char its_name[BUFSIZ];
/*如果本目录的i-节点与上级目录不同,即本目录不是根目录*/
if (get_inode("..")!=this_inode)
{
chdir(".."); //进入上级目录
inode_to_name(this_inode,its_name,BUFSIZ);
my_inode = get_inode(".");
printpathto(my_inode);
printf("/%s",its_name);
}
}
void inode_to_name(ino_t inode_to_find,char* namebuf,int buflen) //找到i-节点对应的文件名,并放在字符数组里
{
DIR* dir_ptr;
struct dirent* direntp;
dir_ptr = opendir(".");
if (dir_ptr == NULL)
{
perror(".");
exit();
}
/*上面是打开一个目录流,然后下面是通过目录流读取来查找当前目录的与要找的i-node相对应的文件名,之后关闭目录流*/
while((direntp = readdir(dir_ptr)) != NULL)
{
if(direntp->d_ino == inode_to_find)
{
strncpy(namebuf,direntp->d_name,buflen);
namebuf[buflen-] = '\0';
closedir( dir_ptr);
return;
}
}
fprintf( stderr , "error looking for inum % d\n" ,inode_to_find);
exit () ;
}
ino_t get_inode(char* fname)//根据文件名,返回-i节点
{
struct stat info;
if ( stat( fname, &info) == -){
fprintf( stderr , "Cannot stat ");
perror(fname);
exit ();
}
return info.st_ino;
}

实验截图:


本周学习感想

上课的时候认真听了一段时间,就是讲 如找上级目录的那一部分,我有想到找.和..目录以及i节点匹配 ,但是结束的时候怎么办没想清楚,以后再学习计算机系统结的时候还需要更强的计算机思维

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

  1. 20165223《信息安全系统设计基础》第九周学习总结 & 第八周课上测试

    目录 [第九周学习总结] 教材内容总结 [第八周课上测试] (一)求命令行传入整数参数的和 (二)练习Y86-64模拟器汇编 (三)基于socket实现daytime(13)服务器和客户端 参考资料 ...

  2. 2017-2018-1 20155326 《信息安全系统设计基础》第四周学习总结及myod改进版的补交

    2017-2018-1 20155326 <信息安全系统设计基础>第四周学习总结及myod改进版的补交 学习内容 补充完成课上没有完成的内容 学习教材附录A,第十章内容 参考别出心裁的Li ...

  3. 2017-2018-1 20155305 《信息安全系统设计基础》第四周学习总结(课堂提交作业未来得及提交码云链接myod补充博客)

    2017-2018-1 20155305 <信息安全系统设计基础>第四周学习总结(课堂提交作业未来得及提交码云链接myod补充博客) 课堂提交题目要求 编写MyOD.java 用java ...

  4. 2017-2018-1 20155318 《信息安全系统设计基础》第九周课下实践——实现mypwd

    2017-2018-1 20155318 <信息安全系统设计基础>第九周课下实践--实现mypwd 相关知识 man -k 查找含有关键字的内容 与管道命令结合使用:man -k k1 | ...

  5. 20155216 2017-2018-1 《信息安全系统设计基础》第二周课堂练习补交以及Myod的实现

    20155216 2017-2018-1 <信息安全系统设计基础>第二周课堂练习补交 课堂测试3:行断点的设置 运行截图: 未完成原因:课前未安装 cgdb 具体步骤: 1.输入命令:gc ...

  6. 2017-2018-1 20155232 《信息安全系统设计基础》第四周学习总结以及课上myod练习补充博客

    2017-2018-1 20155232 <信息安全系统设计基础>第四周学习总结以及课上myod练习补充博客 课上myod练习 1 参考教材第十章内容 2 用Linux IO相关系统调用编 ...

  7. 2017-2018-1 20155320 《信息安全系统设计基础》第四周学习总结(课堂实践补交+myhead与mytail加分项目)

    2017-2018-1 20155320 <信息安全系统设计基础>第四周学习总结(课堂实践补交+myhead与mytail实现) 课堂实践内容 1 参考教材第十章内容 2 用Linux I ...

  8. # 20155337 2017-2018-1 《信息安全系统设计基础》第二周课堂实践+myod

    20155337 2017-2018-1 <信息安全系统设计基础>第二周课堂实践+myod 因为在课上已经提交了四个实验,还欠缺最后一个实验,反省一下自己还是操作不熟练,平时在课下应该多多 ...

  9. 20172328 2018—2019《Java软件结构与数据结构》第二周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第二周学习总结 概述 Generalization 本周学习了第三章集合概述--栈和第四章链式结构--栈.主要讨论了集合以 ...

  10. 20135234mqy-——信息安全系统设计基础第五周学习总结

    程序的机器级表示 3.1 intel处理器系列俗称x86,经历了一开始个长期的,不断进化的发展过程. 开始时它是第一代单芯片,16位微处理器之一,由于当时集成电路技术水性有限,其中做了很多妥协,此后, ...

随机推荐

  1. Xcel 测试版使用手册

    基于无任何文笔可言,所以直接上使用方法吧. 1.引用dll,如何引用dll请谷歌. 2.使用 //实例化对象 LT.XMLExcel.XlsxOption xOption = new LT.XMLEx ...

  2. ruby中的win32ole使用

    ruby中的win32ole是一个标准库,使用的时候只要添加require 'win32ole'就行. 下面是一段模拟一个登陆的代码 require 'win32ole' ie = WIN32OLE. ...

  3. 2018 Multi-University Training Contest 9 Solution

    A - Rikka with Nash Equilibrium 题意:构造一个$n * m$的矩阵,使得$[1, n * m]$ 中每个数只出现一次,并且纳什均衡只出现一次. 思路:从大到小的放置,每 ...

  4. 2015ACM/ICPC亚洲区沈阳站 Solution

    A - Pattern String 留坑. B - Bazinga 题意:找一个最大的i,使得前i - 1个字符串中至少不是它的子串 思路:暴力找,如果有一个串已经符合条件,就不用往上更新 #inc ...

  5. P3327/bzoj3994 [SDOI2015]约数个数和(莫比乌斯反演)

    P3327 [SDOI2015]约数个数和 神犇题解(转) 无话可补 #include<iostream> #include<cstdio> #include<cstri ...

  6. 微信小程序:工具配置 project.config.json

    微信小程序:工具配置 project.config.json 一.项目配置文件project.config.json 小程序开发者工具在每个项目的根目录都会生成一个 project.config.js ...

  7. 20145221 《Java程序设计》课程总结

    20145221 <Java程序设计>课程总结 每周读书笔记链接汇总 Atom使用心得 - 21世纪的编辑器 网络安全攻防学习平台 - 基础关 Java实现:数据结构之排序 2014522 ...

  8. 20145325张梓靖 《Java程序设计》第3周学习总结

    20145325张梓靖 <Java程序设计>第3周学习总结 教材学习内容总结 类与对象 类,就相当于设计图纸,用"new"创建的对象,就是依据设计图做成的成品:设计图纸 ...

  9. POJ 1840 Eqs(乱搞)题解

    思路:这题好像以前有类似的讲过,我们把等式移一下,变成 -(a1*x1^3 + a2*x2^3)== a3*x3^3 + a4*x4^3 + a5*x5^3,那么我们只要先预处理求出左边的答案,然后再 ...

  10. 在python中引用jar包

    在本文中,首先创建一个maven项目,然后打包成jar包,在python中调用jar包,执行java类方法. 1.在eclipse中创建maven项目 我这里创建一个普通java项目,择选择 “mav ...