linux篇【8】:基础IO—<后序>
创始人
2024-03-31 13:11:41

目录

一.myshell中实现重定向

1.myshell中实现重定向

二.标准输出与标准错误

小知识点:linux下的c++后置——.cpp / .cc / .cxx

1. 示例解释

./a. out > stdout. txt 解释:

 ./a.out 1> stdout. txt 2>stderr. txt 解释:

 ./a.out 1> stdout. txt 2>stderr. txt的意义:

 ./a. out > all. txt 2>&1:

2.perror和模拟实现

三.文件系统

1. 磁盘的物理结构

2.磁盘的存储结构

3.磁盘的逻辑抽象结构

(1)LBA地址转换为CHS地址( 磁柱(Cylinder),磁面(Head),扇区(Sector) )


一.myshell中实现重定向

1.myshell中实现重定向

ChangeDir

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include #define SEP " "
#define NUM 1024
#define SIZE 128//跳过 //ls -a -l>>  log.txt 的>>和log.txt之间空格操作:
#define DROP_SPACE(s) do { while(isspace(*s)) s++; }while(0)char command_line[NUM];
char *command_args[SIZE];char env_buffer[NUM]; //for test#define NONE_REDIR  -1
#define INPUT_REDIR  0
#define OUTPUT_REDIR 1
#define APPEND_REDIR 2int g_redir_flag = NONE_REDIR;
char *g_redir_filename = NULL;extern char**environ;//对应上层的内建命令
int ChangeDir(const char * new_path)
{chdir(new_path);return 0; // 调用成功
}void PutEnvInMyShell(char * new_env)
{putenv(new_env);
}void CheckDir(char *commands)
{assert(commands);//[start, end)char *start = commands;char *end = commands + strlen(commands);// ls -a -lwhile(start < end){if(*start == '>'){if(*(start+1) == '>'){//ls -a -l>>  log.txt --追加*start = '\0';start += 2;g_redir_flag = APPEND_REDIR;DROP_SPACE(start);g_redir_filename = start;break;}else{//ls -a -l > log.txt -- 输出重定向*start = '\0';start++;DROP_SPACE(start);g_redir_flag = OUTPUT_REDIR;g_redir_filename = start;break;}}else if(*start == '<'){// 输入重定向*start = '\0';start++;DROP_SPACE(start);g_redir_flag = INPUT_REDIR;g_redir_filename = start;break;}else {start++;}}
}int main()
{//shell 本质上就是一个死循环while(1){g_redir_flag = NONE_REDIR;g_redir_filename = NULL;//不关心获取这些属性的接口, 搜索一下//1. 显示提示符printf("[张三@我的主机名 当前目录]# ");fflush(stdout);//2. 获取用户输入memset(command_line, '\0', sizeof(command_line)*sizeof(char));fgets(command_line, NUM, stdin); //键盘,标准输入,stdin, 获取到的是c风格的字符串, '\0'command_line[strlen(command_line) - 1] = '\0';// 清空\n//2.1 ls -a -l>log.txt or cat>log.txt or ls -a -l// ls -a -l>log.txt -> ls -a -l\0log.txtCheckDir(command_line);//3. "ls -a -l -i" -> "ls" "-a" "-l" "-i" 字符串切分command_args[0] = strtok(command_line, SEP);int index = 1;// 给ls命令添加颜色if(strcmp(command_args[0]/*程序名*/, "ls") == 0 ) command_args[index++] = (char*)"--color=auto";// = 是故意这么写的// strtok 截取成功,返回字符串其实地址// 截取失败,返回NULLwhile(command_args[index++] = strtok(NULL, SEP));//for debug//for(int i = 0 ; i < index; i++)//{//    printf("%d : %s\n", i, command_args[i]);//}// 4. TODO, 编写后面的逻辑, 内建命令if(strcmp(command_args[0], "cd") == 0 && command_args[1] != NULL){ChangeDir(command_args[1]); //让调用方进行路径切换, 父进程continue;}if(strcmp(command_args[0], "export") == 0 && command_args[1] != NULL){// 目前,环境变量信息在command_line,会被清空// 此处我们需要自己保存一下环境变量内容strcpy(env_buffer, command_args[1]);PutEnvInMyShell(env_buffer); //export myval=100, BUG?continue;}// 5. 创建进程,执行pid_t id = fork();if(id == 0){int fd = -1;switch(g_redir_flag){case NONE_REDIR:break;case INPUT_REDIR:fd = open(g_redir_filename, O_RDONLY);dup2(fd, 0);break;case OUTPUT_REDIR:fd = open(g_redir_filename, O_WRONLY | O_CREAT | O_TRUNC);dup2(fd, 1);break;case APPEND_REDIR:fd = open(g_redir_filename, O_WRONLY | O_CREAT | O_APPEND);dup2(fd, 1);break;default:printf("Bug?\n");break;}//child// 6. 程序替换, 会影响曾经子进程打开的文件吗?不影响//exec*?execvp(command_args[0]/*不就是保存的是我们要执行的程序名字吗?*/, command_args);exit(1); //执行到这里,子进程一定替换失败}int status = 0;pid_t ret = waitpid(id, &status, 0);if(ret > 0){printf("等待子进程成功: sig: %d, code: %d\n", status&0x7F, (status>>8)&0xFF);}}// end while
}

二.标准输出与标准错误

小知识点:linux下的c++后置——.cpp / .cc / .cxx

1. 示例解释

./a. out > stdout. txt 解释:

默认只能重定向标准输出

 ./a.out 1> stdout. txt 2>stderr. txt 解释:

1> stdout. txt:stdout的内容重定向;2>stderr. txt stderr的内容重定向

 ./a.out 1> stdout. txt 2>stderr. txt的意义:

可以区分哪些是程序日常输出哪些是错误!——日至等级

 

 ./a. out > all. txt 2>&1:

把标准输出和标准错误混着输到一个文件

 

解释:./a.out > all.txt 是普通的把标准输出重定向——把[1]指向了文件all.txt,2>&1是把[1]拷贝给[2],使得标准错误重定向——把[2]也指向了文件all.txt

2.perror和模拟实现

 

errno:C语言有一个全局变量,记录最近一次C库函数调用失败的原因!

三.文件系统

上面我们学到的所有的东西,全部都是在内存中,但是不是所有的文件都被打开了——大量的文件就在磁盘上 静静的躺着,这批文件非常多,杂,乱
磁盘基本的文件管理,本质工作和快递点的老板做的工作是一样的。磁盘基本的文件管理就叫文件系统。
所以我们要把视角从内存中移开,迁移到磁盘上!

1. 磁盘的物理结构

磁盘是我们电脑上的唯一的一个机械设备,目前,同学们笔记本上,可能已经不用磁盘了。而是SSD
你的文件数据,就在这个盘面上。

磁盘图片:

一个面,一个磁头!
机械式+外设 = 磁盘一定是很慢的(CPU,内存)
磁盘存储数据:电子分NS极,磁盘的一面有很多个类似电子的单元,通过磁头改变电子的NS几来改变01。
磁性:N,S极
改变NS极——>就是改变了01

2.磁盘的存储结构

磁盘上存储的基本单位是扇区512字节
读写磁盘的时候,磁头找的是某一个面某一个磁道某一个扇区

哪一个面由哪一个磁头决定;哪个磁道——>要知道是哪一个柱面的——>距离圆心的半径——>也是由哪一个磁头决定;哪一个扇区——>磁道上的一段——>由盘面旋转决定的

 

 柱面:

文件系统:什么文件,对应了几个磁盘块!
物理上查找某一个扇区的寻址方式叫 CHS地址(对应下图        磁柱(Cylinder),磁面(Head),扇区(Sector)):只要我们能找到磁盘上的盘面,柱面(磁道),扇区找到一个存储单元。用同样的方法,我们可以找到所有的基本单元! !

 

3.磁盘的逻辑抽象结构

类比磁带,把磁盘抽象成一个数组。假设有10000000个扇区,每个扇区是512字节,类型是sector

对磁盘的管理,转化成为了对数组空间的管理! !定位一个sector,只要找到下标就行了!这里的下标叫做 LBA(logic block address 逻辑块地址)

(1)LBA地址转换为CHS地址( 磁柱(Cylinder),磁面(Head),扇区(Sector) 

假如要找第3234个扇区,假如有4个磁盘面,4个磁盘面放在一个数组,一面假设是1000个扇区,3234/1000=3,第一面是0~1000,第二面是1000~2000,第三面是2000~3000,第四面是3000~4000。所以3234这个扇区在第4面,磁面H=4,假设一个磁盘面上有20个磁道,3234%1000=234,234/20=11,磁柱C=11,234%20=14,扇区S=14,即可得到CHS地址的三个值

 

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...