minix管道实现小究

Minix文件系统和Linux文件系统比较   Minix是荷兰Vrjie大学的Andrew S. Tanenbaum教授编写的一个类Unix操作系统,虽然在功能和规模上不能和Unix相比,但作为操作系统的学习对象是非常合适的。Minix一共约一万两千行代码,在Tanenbaum教授所著的“Operating Systems: Design and Implementation”一书中有具体的注释和讲解。Minix虽然是Unix 阅读详情

在考研复习时候遇到的问题,很想写下来,虽然时间已经很紧张,但是在我们师生的问答互助之间,学术似乎更显神圣了,比起肮脏的考试制度来说……(请配合代码看)

问题表述:

      在minix里面,使用如下命令会使系统在2个进程之间建立管道用来进行进程之间的通讯:

      #cat file1 file2|sort

     那么它的作用显而易见,列出file1和2的内容并排序放入另一文件。那么在内核当中是如何实现的呢?道理很简单,这条指令被shell接受以后会产生一个系统调用sys_call,名字是PIPE。调用的格式首先是使用库函数(minix的系统调用使用库函数)pipe(&fd[0]);其中fd[ ]这个数组的声明是这样子的:

int fd[2]

它是文件引用的数组,由于在2个进程当中,所以对文件使用2个引用定向到不同进程的输入输出就可以了。那么pipe建好了,其内容就是一个内存块m(实际上是消息机制的消息结构块,m_i1,m_i2),m的2个域赋值给fd的2个cell,当然一读一写。好,然后我们开始fork系统调用,这次我们会得到2个进程,一对父子。下面我们假设从父亲发出信息,儿子取消息。我们会怎么做呢?

问题解决:

1.我们会关闭管道的读写,以备下面给父子分配读写引用

2.父子进程会由管道方向安排读写的放弃,例如,在这里,父亲放弃读引用STD_OUTPUT,儿子自然放弃

   STD_INPUT,注意,这个时候有一个关键问题,也是我误解的问题,文件下面会使用dup函数重新连接2个

   引用,机制是选择文件描述符的整数值最低的1个。那么文件描述符究竟是怎么分配的呢?经过林老师的指点

   发现在每个进程有3个文件引用0-stdin,1-stdout,2-stderr,那么放弃1的父亲和放弃0的儿子就会分别

   将新的文件引用dup到1和0上面

3.自然就是dup挂接引用了。注意dup里面使用了fcntl所以你将看到这个连接的方式就是从0开始找到最小的

空闲的描述连接他。至此pipe就建立了。特嫩鲍姆说他的minix的pipe最大时4096+3072,并且可以自行分配

空间大小,如果溢出,就会在loop当中死锁,这是显然的,呵呵。

#include STD_INPUT 0
#include STD_OUTPUT 1
 

 pipeline(process1,porcess2)
 char *process1,*process2;//旧的C标准参数声明吧~~~~~
 {
  int fd[2]; //存储读写的文件引用
  
  pipe(&fd[0]);//create a pipe
  if(fork()!=0){
    //父进程的语句
    close(fd[0]);   //关闭管道读
    close(STD_OUTPUT);
   dup(fd[1]);   //标准输出指向fd[1] 

/*===============================================================================

/*这里是dup的原形*/

PUBLIC int dup(fd)
{
  return(fcntl(fd,F_DUPFD,0));
}

==============================================================================*/  
    close(fd[1]);  //不再需要描述符
   execl(process1,process1,0);
   }
   else
   {
     //子进程的代码
    close(fd[1]);
    close(STD_INPUT);
   dup(fd[0]);
    close(fd[0]);
  execl(process2,process2,0);
  }
 }
 //===========================================================================================

copyright of all code used in this text belongs to Dr.Andrew S. Tanenbaum

thank you very much.

鸣谢:我的老师 林丰波先生,感谢他在百忙之中回答我的问题。

最后,祝愿包括自己在内天下考研同学成功~~~~~

Minix文件系统概述 参照《操作系统:设计与实现》,本文中的很多文字和图片来源于此书。MINIX文件系统是一个逻辑的、自包含的实体。在磁盘上它由六部分组成,分别是:引导块,超块、i-节点、i-节点位图、区段位图、数据块。具体结构如下图所示:每个文件系统都以引导块开始,引导块的最后两个字节是魔数0x55AA.引导块大小为数据块的一块,一般为512字节。启动计算机时,硬件从引导设备将磁盘的引导块读入内存,转而执行其代码,接下来引导块负责将操作系统从磁盘读入内存,并启动操作系统。超级块包含了文件系统的布局信息,它的主要功能是给出文件系 阅读详情

相关推荐

MINIX 30年经验教训

作者: Andrew S. Tanenbaum,阿姆斯特丹自由大学科学学院计算机科学系名誉教授。 译者:孙薇 责编:钱曙光 本文为《程序员》文章,未经允许不得转载,更多精彩文章请订阅2016年《程序员》 Linux已经为众人所熟知,而它的直接始源——MINIX到现在也有30年历史了,如此高龄的软件却还依旧充满生机。MINIX的故事,以及它和Linux的出现历史流传并不广泛...

优快云 人工智能 4069

minix文件系统

总结:文件节点数据区存放指向文件数据的指针,目录项节点数据区存放目录的目录项和文件的目录项。目录的目录项和文件的目录项都为32字节(当minix版本为0x138F时,1块数据区可以存 1024 /32 = 32 个目录项)。在linux最初的时候就是使用的minix文件系统,学习minix文件系统有助于理解,linux VFS虚拟文件系统,超级块,目录项,文件,i节点。

klp1358484518的博客 1520

大连理工大学中文情感词汇本体库(含情绪分析代码)

中文文本数据的情绪计算昨天如何对微博推文进行情绪分析(细粒度情感分析)介绍了英文的NRC情绪词典。虽然支持中文,但由于制作问题,导致并不完全适应中文场景。今天介绍大连理工大学中文情感...

大邓和他的Python 4万+

linux0.11 minix1.0文件系统 下篇 根节点的 buffer_head结构,根节点内容

第一个i节点块的第一个i节点对应的是根节点,因为这个节点的izone[0]为0x027e!!! 41ed是文件类型 0x19294是根节点对应的内存i节点地址,izone[0]是0x0274 0x1fc50是根目录的buffer_head指针,既缓冲头指针,根目录的块号为0x027e,数据所在的高速缓冲区地址是0x003f400。

linux-0.11调试教程 2176

测试人必看!正交表与Allpairs工具对比:如何选择最适合你的组合测试方案?

本文深入对比了正交表、PICT与Allpairs三种主流组合测试方案,帮助测试人员根据项目场景做出最佳选择。文章分析了各自的核心原理、优劣势及适用场景,特别强调了在涉及复杂约束时PICT工具的强大功能,并提供了从原理学习到CI/CD集成的实战选型指南。

weixin_29224309的博客 267

NR RRC协议(2)---RRC连接建立流程

RRC连接建立目的是建立SRB1 RRC连接建立还用于将初始NAS消息从UE传送到网络 RRC连接的初始阶段期间,不激活AS安全性 RRC连接建立由UE侧发起

crg2046的博客 1957

文件系统(三)—老祖宗长的什么样

否则就需要从链表的free_list头指针开始搜索,即最近最少使用的缓存块开始,因此最理想的找到一个完全空闲的缓存块,即b_dirt和b_lock标志位均为0的缓存块;对于高速缓冲区,最重要的是getblk()处理过程,函数在每次获取新的空闲缓冲块时,就会把它移到free_list头指针所指链表的最后面,即越靠近链表末端的缓冲块被使用的时间就越近,因此如果Hash表中没有找到对应缓存块,就会在搜索新的空闲缓存块时从free_list链表头开始,内核取得缓存块算法使用以下的策略。

生活需要深度 508

485芯片AB波形正负半周的问题探讨

      本人做的一个产品,产品的其中一个接口是RS485的,我们使用的芯片是MAX13487E。MCU是STM32F103,MCU的USART通过光耦隔离后,接到MAX13487E。因为STM32F103的VCC是3.3V的,MAX13487E的VCC是5V。      部分原理图如下,上述部分电路参考了官方的参考设计,现在测试的AB波形时候发现如下问题。1.把R10和R16改为1k,示波器C...

qq_26308521的博客 1万+

MINIX 1.0 文件系统的实现(C/C++实现)

在硬盘的主引导记录块中除了没有用到的引导程序外,在其包含的第一个物理扇区的尾部(引导标识0x55aa的前面)是一个64字节的分区表(典型的IBM Partition Table),其中每个分区表项占用16字节,共有4个分区表项。如果 i 节点对应的是一个目录,则在该 i 节点的 i_zone 数组对应的逻辑块中会保存所有子文件和子目录的目录项信息。所以,当需要访问一个文件时,需要根据文件的全路径(例如/bin/sh)从根节点找到子目录的 i 节点,然后再从子目录的 i 节点找到文件的 i 节点。

Jaxonic的博客 1216

CloudCompare 二次开发(9)——半径滤波

基于PCL对CloudCompare软件进行二次开发,实现的算法功能是半径滤波

点云侠的博客 1400

Android功耗系列专题分析之四:待机概率性功耗高的失效分析

本文分析了Android设备待机功耗异常高的问题。通过日志发现系统休眠失败,原因是PowerManagerService.Display唤醒锁未被释放。进一步排查发现,指纹解锁功能在灭屏时未正确释放屏幕锁定,导致DisplayReady状态异常。解决方案是将指纹功能的背光控制与DisplayReady状态控制分离,使用两个变量独立管理。经验表明,快速定位问题比解决问题更重要,修改原生流程时需谨慎评估风险。

451

minix1.0 文件系统研究

本文介绍了minix1.0文件系统的研究过程。首先创建了一个1.44MB磁盘镜像并格式化为minix1.0文件系统,创建测试文件后卸载。然后分析了minix1.0的结构特点:使用1K逻辑块、7个直接指针的inode结构、14字节文件名限制,以及6个分区布局(引导块、超级块、inode位图、数据块位图、inode区和数据区)。通过010editor工具查看镜像文件,详细解析了各分区的二进制内容。最后介绍了编写代码验证文件系统的方法,包括定义超级块、inode和目录项等关键数据结构,为后续编程分析奠定基础。

hjjdebug的专栏 386

无人船 | 基于ROS的轻量级多无人艇自主导航仿真框架

无人水面艇USV是海上自主无人系统的关键组成部分,在民用、军用领域应用广泛,例如海上救援、水质测量、扫雷反潜等,因此对USV导航算法的研究具有重要意义。为了便于进行USV相关算法的验证与部署,本文介绍的这套基于ROS的多无人艇的自主导航仿真平台,轻量化地实现了建图、规划、控制等多种功能,同时自研框架保证了功能的高度可拓展和可定制

FRIGIDWINTER的博客 7999

Minix 1.0文件系统的实现

Minix 1.0文件系统的实现一、概述    在sys_open中,我们并没有讨论如何将文件路径名转化为具体的inode,它使用的是open_namei这个函数实现的。这里面涉及到文件系统的实现。本文将从这个函数出发,说明如何将文件路径名转化为具体的inode,以及普通文件和目录是怎么实现的,在硬盘中是怎么存储的。二、解析文件路径2.1 通过路径名获得对应的节点open_namei    open

ac_dao_di的专栏 5183

超声波传感器(CH101&ch201) - Ⅰ

压电微机械超声换能器(PMUT)和超声波信号处理的可编程片上系统(SoC)集成在一起的传感器

nicole088的专栏 2796

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

MINIX文件系统

MINIX文件系统与标准的UNIX的文件系统基本相同,由6部分组成:引导块、超级块、i节点位图、逻辑块位图、i节点、数据区。 引导块是计算机加电启动时可由ROM BIOS自动读入的执行代码和数据。但并非所有盘都用作引导设备,所以对于不用于引导的盘片,这一盘块中可以不含代码。但任何盘片必须要含有引导块空间,以保持MINIX文件系统格式的统一。如果内核文件放在文件系...

weixin_34174132的博客 217

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Linux 文件系统之 MINIX 文件系统

MINIX 文件系统与标准 UNIX 的文件系统基本相同,它由 6 个部分组成:①引导块;②超级块;③ i 节点位图;④逻辑块位图;⑤i 节点;⑥数据块。对于一个普通的磁盘块设备来说,其各部分的分布见下图: 整个块设备被划分成以 1KB 为单位的磁盘块。 引导块是计算机加电启动时可由 ROM BIOS 自动读入的执行代码和数据盘块。但一个系统中并非所 有盘设备都用于作为引导设备,所以对于不用于引导的盘片,这一盘块中可以不含代码。但任何盘块设 备必须含有引导块空间,以保持 MINIX 文件系统格式的统一。即

qq_30192655的博客 2396

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

从零编写linux0.11 - 第九章 文件系统(一)

简单地实现了 open,read,write,close等函数。

皓空Fly的博客 1139

Minix 操作系统

1.关于minix 的介绍     http://baike.baidu.com/view/390953.htm 2.源代码     https://github.com/jncraton/minix3

Creak_Phone的专栏 922

Minix文件系统阅读笔记之get_block

PUBLIC struct buf *get_block(dev, block, only_search) register dev_t dev; /* on which device is the block? */ register block_t block; /* which block is wanted? */ int only_search; /* if NO_READ, do

grantxx的专栏 1662

Linux1.0虚拟文件系统(VFS)

Linux1.0虚拟文件系统(VFS) 在linux1.0操作系统当中文件系统是非常重要的一环,Linux操作系统当中支持的文件系统众多,如ext,ext2,minix,iosfs等等。当我们在使用操作系统提供的文件读写api来操作系统中的文件的时候,操作系统内部是怎么去完成我们想要的功能呢?在操作系统当中设计了一种虚拟文件系统,就是将所有的文件系统都给抽象出来,形成不同的文件系统使用相同的ap

网球小子的博客 1012

Minix下的汇编2

  似乎minix平台并没有带一个真正的汇编编译器,看看makefile,几乎都是清一色的用cc来编译汇编代码的。而且,即使是一个最简单功能的汇编程序,也少不了一个“_main”标签。  在minix的默认编译器(即cc)中,字操作指令和字节操作指令是分开的。我想这样也许是为了简化编译器的设计吧,毕竟判断“movb ah,12”比判断“mov ah,12”是不是字操作要容易得多。  现在也算是入门

轰阳的专栏 1862

minix 3 出了图形版

一直以为minix不开发了,没想到它已经升级到第三版了。访问http://www.minux3.org就会看到,不仅升级到3.0版,而且发布了图形用户界面(如上图)。其图形用户界面是在2007年1月10日正式发布的。还不错吧?minix 是linux操作系统开发的基础,其作者是linus大学老师。而且后来两个作者还爆发了关于操作系统巨内核和微内核之争。linux采用的是巨内核,而且获得了成功。微

周海汉的开发专栏 1万+
上一篇: 串比较的若干算法归类————普通、KMP算法
下一篇: 忆我的大学老师----(一)
fishstudio
博客等级 码龄23年 4粉丝 41原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值