系统级I/O的小白见解

输入/输出(I/O)是在主存和外部设备之间复制数据的过程。
输入操作:从I/O设备数据到主存
输出操作:从主存复制数据到I/O设备

UNIX I/O

打开文件:一个应用程序通过要求内核打开相应的文件,来表明它想要访问一个I/O设备。这时内核会返回一个小的非负整数,叫做文件描述符(它是关键!它返回的是当前所能用的最小数):用来标识这个文件。
Linux shell 创建的每个进程开始时都有三个打开的文件:标准输入(文件描述符为0),标准输出(1),标准错误(2)
改变当前文件的位置:对于每个打开的文件,内核保持着一个文件位置K,初始为0,应用程序能通过执行seek操作,显示的设置K
读写文件:一个读操作就是从文件复制n>0个字节到内存,从K位置开始,当超过时会触发一个称为EOF的条件。
关闭文件:当应用完成对文件的访问之后,就通知内核关闭这个文件。作为相应,内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。

文件

普通文件(regular file):包含任意数据,如文本文件和二进制文件(但这哥俩在内核眼中没有区别,都是0101组成的)
目录(directory):是包含一组Link的文件,每个Link都将一个文件名映射到一个文件,Linux内核将所有文件都组织成一个目录层次结构,由根目录:/ 确定。
套接字是用来与另一个进程进行跨网络通讯的文件。

实验一

  • 在这里插入图片描述
    假设文件内容为abcde,
    本来fd1,fd2,fd3打开同一个文件,
    dup2(fd2,fd3)让fd3指向fd2打开的文件,
    所以fd1,fd2输出的是a,fd3输出的是3,
    则输出结果为c1=a,c2=a,c3=b

实验二

在这里插入图片描述
这里提及到了有关fork()的知识,输出结果有两种。
当s=0时,父进程先执行,输出
Parent: c1 = a, c2 =b
Child: c1 = a, c2 = c
s=1,则子进程先执行,输出
Child: c1 = a, c2 = b
Parent: c1 = a, c2 =c

实验三

在这里插入图片描述
此处由于dup将fd2指向了fd1的后面,导致fd3的jklmn中前四位被wxyz覆盖,
所以最终结果为pqrswxyznef。

详细解释请参考《计算机系统基础》,诸多不足还请大家多多见谅。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值