2020校招备战日记4.28 ---- 共享文件,IO重定向,标准IO,网络编程概述

目标完成情况

  • 牛客两道题 ---- 没做
  • csapp第10章过完,第11章过一半 ---- 今天看的书还是比较多的

学习回顾

今天虽然看的书比较多,但是似乎没有特别多自己主动的思考。现在感觉记忆很少了。

共享文件

这个地方主要需要理解Linux内核中对于打开的文件的表示。有三个数据结构:

  1. 文件描述符表(进程私有) ----- 每一个条目由一个小整数来标识,其中有一个指针,指向打开文件表中的一个条目。
  2. 打开文件表(所有进程共享)----- 有一些文件的基本信息,主要是文件名、文件位置和引用计数。其中还有一个指针,指向v-node表中的一个条目。
  3. v-node表(所有进程共享)----- 存储了一个打开文件的更详细的信息。
    在这里插入图片描述
    所谓文件共享,是指每个进程虽然有私有的打开文件描述符表,但是该表中的指针指向的打开文件可能是相同的,进而,v-node表项可能也是相同的,从而不会再全局上增加很多重复的表项。上图中,文件A和文件B可能是同一个文件,而仅仅是文件位置不同。文件位置并不是说整个文件存放在磁盘什么位置,而是当前读取到了文件的什么位置,应该说是一个偏移量

一种典型的文件共享,发生在fork的时候,fork之后,子进程和父进程在文件上是完全共享的,只不过子进程复制了一份打开文件描述符表, 而关于打开文件的更加详细信息的数据结构则完全没有靠背,这类似于浅拷贝。
在这里插入图片描述
在上图中,在fork之后,只有红框部分是子进程拷贝的,其他东西都是和父进程共享的全局的全局数据结构。

IO重定向

分为O重定向和I重定向。

  1. O重定向,即输出重定向。举个例子,原来是输出到标准输出(也就是屏幕)的,在进行重定向之后,原先的输出内容就全部输出到某个磁盘文件上了。或者也可以反过来。
  2. I重定向, 即输入重定向。举个例子, 原来都是从标准输入(也就是键盘)输入的,在进行重定向之后,输入的来源就变成了某个磁盘文件了。或者也可以反过来。

其实现原理是dup2函数。就是将一个文件描述符的条目覆盖另一个文件描述符条目,其实就是改变描述符对应的文件表条目指针。这样下次引用相同的描述符,其指向打开文件可能就不再是标准输入输出,而是磁盘文件了。 我们都知道,在Linux看来,标准输入输出、磁盘文件、网络,都是一样的标识方法:都是文件,都有前面讲过的文件描述符、打开文件表、v-node表。

Linux shell提供了两个操作符来实现IO重定向: < 和 >.

  • ‘<’ 输入重定向。---- 读作“输入被重定向成左边的
  • ‘>’ 输出重定向。---- 读作“输出被重定向成右边的

举个例子:
在这里插入图片描述
原本的cat hello命令,是以“hello”作为输入,将hello的内容输出到屏幕。
而上图中的命令,输入被重定向成了左边的“foo.txt”输出被重定向成了右边的“new.txt”,所以最终效果就是将foo.txt的内容复制到了new.txt中,如下图所示。而hello文件既没有被输入,也没有被输出。
在foo.txt和new.txt是一样的

网络编程概述

讲了客户服务器模型、套接字、套接字地址和套接字函数。感觉讲得没有《TCP/IP协议族》清楚。

  1. 在客户端,需要调用socket函数,创建套接字描述符,然后生成服务器套接字地址,然后connect服务器,然后就可以将套接字描述符当成普通文件描述一样, 进行对网络的读和写了。
  2. 在服务端,需要调用socket函数,创建套接字描述符,此外还要创建一个套接字地址结构,用来接收客户端的套接字地址,然后需要调用bind函数来完成套接字描述符和套接字地址的绑定,然后,就可以调用accept函数来接收连接,一旦连接成功,accept函数就会返回一个连接套接字描述符,然后这个连接套接字就可以进行读写了。

明日目标

  • 牛客两道题
  • 完成csapp最后一节tiny服务器
  • csapp并发编程看一半
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值