2018-2019-1 20165212 《信息安全系统设计基础》第八周学习总结(pwd)
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)的更多相关文章
- 20165223《信息安全系统设计基础》第九周学习总结 & 第八周课上测试
目录 [第九周学习总结] 教材内容总结 [第八周课上测试] (一)求命令行传入整数参数的和 (二)练习Y86-64模拟器汇编 (三)基于socket实现daytime(13)服务器和客户端 参考资料 ...
- 2017-2018-1 20155326 《信息安全系统设计基础》第四周学习总结及myod改进版的补交
2017-2018-1 20155326 <信息安全系统设计基础>第四周学习总结及myod改进版的补交 学习内容 补充完成课上没有完成的内容 学习教材附录A,第十章内容 参考别出心裁的Li ...
- 2017-2018-1 20155305 《信息安全系统设计基础》第四周学习总结(课堂提交作业未来得及提交码云链接myod补充博客)
2017-2018-1 20155305 <信息安全系统设计基础>第四周学习总结(课堂提交作业未来得及提交码云链接myod补充博客) 课堂提交题目要求 编写MyOD.java 用java ...
- 2017-2018-1 20155318 《信息安全系统设计基础》第九周课下实践——实现mypwd
2017-2018-1 20155318 <信息安全系统设计基础>第九周课下实践--实现mypwd 相关知识 man -k 查找含有关键字的内容 与管道命令结合使用:man -k k1 | ...
- 20155216 2017-2018-1 《信息安全系统设计基础》第二周课堂练习补交以及Myod的实现
20155216 2017-2018-1 <信息安全系统设计基础>第二周课堂练习补交 课堂测试3:行断点的设置 运行截图: 未完成原因:课前未安装 cgdb 具体步骤: 1.输入命令:gc ...
- 2017-2018-1 20155232 《信息安全系统设计基础》第四周学习总结以及课上myod练习补充博客
2017-2018-1 20155232 <信息安全系统设计基础>第四周学习总结以及课上myod练习补充博客 课上myod练习 1 参考教材第十章内容 2 用Linux IO相关系统调用编 ...
- 2017-2018-1 20155320 《信息安全系统设计基础》第四周学习总结(课堂实践补交+myhead与mytail加分项目)
2017-2018-1 20155320 <信息安全系统设计基础>第四周学习总结(课堂实践补交+myhead与mytail实现) 课堂实践内容 1 参考教材第十章内容 2 用Linux I ...
- # 20155337 2017-2018-1 《信息安全系统设计基础》第二周课堂实践+myod
20155337 2017-2018-1 <信息安全系统设计基础>第二周课堂实践+myod 因为在课上已经提交了四个实验,还欠缺最后一个实验,反省一下自己还是操作不熟练,平时在课下应该多多 ...
- 20172328 2018—2019《Java软件结构与数据结构》第二周学习总结
20172328 2018-2019<Java软件结构与数据结构>第二周学习总结 概述 Generalization 本周学习了第三章集合概述--栈和第四章链式结构--栈.主要讨论了集合以 ...
- 20135234mqy-——信息安全系统设计基础第五周学习总结
程序的机器级表示 3.1 intel处理器系列俗称x86,经历了一开始个长期的,不断进化的发展过程. 开始时它是第一代单芯片,16位微处理器之一,由于当时集成电路技术水性有限,其中做了很多妥协,此后, ...
随机推荐
- C语言的 32个关键之和9个控制语言之关键字
auto break case char const continue default do double else enum extern float for goto ...
- hdu6158 The Designer
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6158 题目: The Designer Time Limit: 8000/4000 MS (J ...
- P1174 打砖块
P1174 打砖块 普通分组背包:50pts 题解说的啥????(大雾) 看了半天 $s[0/1][i][j]$表示第$i$列用$j$发子弹,最后一发是1/否0打在该列上的价值 $f[0/1][i][ ...
- double保存小数点后两位
double getRound(double a){ return (int(a * 100 + 0.5)) / 100.0; };//利用的是强制转换
- vs+qt使用资源文件
1.在Resources目录新建一个.qrc文件 2.在解决方案的Resource Files中添加这个文件 3.为这个qrc添加资源,建议把资源都放进Resources
- 【建项目】eclipse maven建立多模块工程
在工作的时候,大多时候都是用Maven来管理项目,可是一般我们都知道怎么用maven管理工程,却不知道通过Maven自己来建立多模块工程.于是自己抽时间,在网上找些资料,做了起来. 建立简单的Mave ...
- NOIP2016 T4 魔法阵 暴力枚举+前缀和后缀和优化
想把最近几年的NOIP T4都先干掉,就大概差16年的,所以来做一做. 然后这题就浪费了我一整天QAQ...果然还是自己太弱了QAQ 点我看题 还是pa洛谷的... 题意:给m个物品,每个物品有一个不 ...
- 解决 E: Could not get lock /var/lib/apt/lists/lock
参考:Unable to lock the administration directory (/var/lib/dpkg/) is another process using it? 在更换软件源时 ...
- URL存在http host头攻击漏洞-修复方案
URL存在http host头攻击漏洞-修复方案 spring boot使用注解的方式 -- 第一步:在自定义filter类上添加如下注释 package com.cmcc.hy.mobile.con ...
- Windows服务程序_测试01
1. #include <stdio.h> #include <Windows.h> #include <tchar.h> #include <process ...