当前位置: 首页 > news >正文

北京网站开发工程师搜索最多的关键词的排名

北京网站开发工程师,搜索最多的关键词的排名,建设彩票网站多少钱,万网主机怎么做网站文章目录 1. 文件描述符分配规则2. 重定向接口dup2自定义shell重定向(补充) 3. 标准输出和标准错误4. 如何理解一切接文件 本章代码gitee地址:文件重定向 1. 文件描述符分配规则 文件描述符的分配规则是从0下标开始,寻址最小的没有使用的数组位置&#…

在这里插入图片描述

文章目录

    • 1. 文件描述符分配规则
    • 2. 重定向接口
      • dup2
      • 自定义shell重定向(补充)
    • 3. 标准输出和标准错误
    • 4. 如何理解一切接文件

本章代码gitee地址:文件重定向

1. 文件描述符分配规则

文件描述符的分配规则是从0下标开始,寻址最小的没有使用的数组位置,它的下标就是新文件的文件描述符。

我们来看一个现象:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>#define filename "log.txt"
int main()
{close(1);int fd = open(filename,O_CREAT|O_WRONLY|O_TRUNC,0666);if(fd < 0){perror("open");return 1;}const char *str = "hello linux\n";int cnt = 5;while(cnt--){write(1,str,strlen(str));}close(fd);return 0;
}

这段代码本应该是想1号文件描述符写入,也就是向显示屏输出信息。我们将这个1号文件描述符指向的显示器文件关闭了,运行结果没有显示出来,这个符合预期。可是,我们发现原本应该向显示器文件写入的内容,却写进了log.txt这个文件。

image-20231107190948481

这个过程就叫做——输出重定向

我们将1号文件描述符关闭,将进程与显示器对应的关联关系去掉。这个1号位置就空出来了,然后我们重新打开一个文件,那么正好1号文件描述符指向的内容是空的,然后就与该文件建立关联关系,所以内容写入这个文件

2. 重定向接口

如果我们想将某个内容重定向,其实不需要我们自己每次都手动关闭某个文件描述符,再去覆盖,系统为我们还提供了一些接口。

dup2

man 2 dup2

image-20231109105208160

这里的并不是拷贝文件描述符,因为文件描述符只是一个数组的下标,本质上拷贝的是文件描述符指向的内容

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>#define filename "log.txt"
int main()
{//close(1);int fd = open(filename,O_CREAT|O_WRONLY|O_TRUNC,0666);if(fd < 0){perror("open");return 1;}dup2(fd,1);close(fd);const char *str = "hello linux\n";int cnt = 5;while(cnt--){write(1,str,strlen(str));}//close(fd);return 0;
}

image-20231109112020545

我们这里就能看到,原本应该向显示器文件输出的内容,重定向到了log.txt文件当中。

重定向的本质就是将文件描述表当中的文件地址做拷贝

自定义shell重定向(补充)

有了这些知识原理,就能写出自己的重定向代码

不了解的可以查看这篇文章——Linux实现简易shell

#define NONE -1
#define IN_RDIR 0
#define OUT_RDIR 1
#define APPEND_RDIR 2
char *rdirfilename = NULL;
int redir = NONE;void check_redir(char *cmd)
{char *pos = cmd;while(*pos){if(*pos == '>'){if(*(pos+1) == '>'){*pos++ = '\0';*pos++ = '\0';while(isspace(*pos))  pos++;rdirfilename = pos;redir = APPEND_RDIR;break;}else{*pos++ = '\0';while(isspace(*pos))  pos++;rdirfilename = pos;redir = OUT_RDIR;break;}}else if(*pos == '<'){*pos++ = '\0';while(isspace(*pos))  pos++;rdirfilename = pos;redir = IN_RDIR;break;}else{//不改变}pos++;}
}void normalExcute(char *_argv[])
{pid_t id = fork();if(id < 0){perror("fork fail");return; }else if(id == 0){//判断是否重定向int fd = 0;if(redir == IN_RDIR) //输入重定向{fd = open(rdirfilename,O_RDONLY);dup2(fd,0);}else if(redir == OUT_RDIR) //输出重定向{fd = open(rdirfilename,O_CREAT|O_WRONLY|O_TRUNC,0666);dup2(fd,1);}else if(redir == APPEND_RDIR)  //追加重定向{fd = open(rdirfilename,O_CREAT|O_WRONLY|O_APPEND,0666);dup2(fd,1);}//子进程执行命令//execvpe(_argv[0],_argv,environ);  //直接程序替换execvp(_argv[0],_argv);   //直接替换程序exit(EXIT_CODE);  //替换失败的退出码}else{//父进程等待子进程退出int status = 0;pid_t rid = waitpid(id,&status,0);  //阻塞等待if(rid == id){lastcode = WEXITSTATUS(status);}}
}

这里的重定向并不会影响到之后的程序替换

因为这里的进程结构体或者是文件结构体,都是属于内核的数据结构,而我们的程序替换是由程序地址空间通过页表来进行一个替换,这也将程序替换和重定向工作进行了解耦

3. 标准输出和标准错误

标准输出stdou和标准错误stderr都是显示器文件输出内容,那他们这两个有什么区别呢

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>#define filename "log.txt"
int main()
{fprintf(stdout,"hello stdout\n");fprintf(stdout,"hello stdout\n");fprintf(stdout,"hello stdout\n");fprintf(stderr,"hello stderr\n");fprintf(stderr,"hello stderr\n");fprintf(stderr,"hello stderr\n");return 0;
}

这里我们运行,确实是发现,都是往显示器文件上输出内容

image-20231111192917656

但是如果我们重定向,这里发现往标准错误输入的内容并没有重定向到我们的目标文件当中,而标准输出的内容被重定向到了目标文件

image-20231111193053970

通过这里我们可以验证,>这个输出重定向的符合,默认就是将一个号文件描述符的内容重定向到目标

image-20231111193321663

但是我们也可以指定将几号文件描述符指向的内容重定向到目标文件当中

这里有个2>&1,意思就是将一号文件描述符的内容拷贝到二号文件描述符当中,让其和1指向同一个文件

4. 如何理解一切接文件

所以操作计算机的动作,都是以进程的形式进行操作的;所以访问文件的操作,也都是以进程的形式访问的。

在计算机里面,存在着各种设备,例如键盘、显示器、磁盘、网卡…,这些都被称之为外设

操作系统和这些外设打交道的时候,都需要它们所对应的方法,例如显示要有读的方法、键盘要有读写方法…每个外设都要有其对应读写方法,这个简称为IO

因为在linux下一切皆文件,所以在操作系统看来,这些外设都是文件,而访问文件的操作,都是以进程的形式访问。linux内核里面又提供了一个方法表的结构struct operation_func,这里面包含了一些函数指针,函数指针可以调用这些外设的读写方法。

每打开一个文件,就会为其创建一个方法集对象,而在struct file中,又包含了一些指针,其中就有一个可以指向这个方法集。

那么在进程创建的时候,进程有对应的文件描述符表,这个表就能指向这些文件,我们用户就提供系统调用,来访问这些文件。

所以从这个struct file往上,我们并不用关心底层访问的是什么东西,我们看到就是一切皆文件

image-20231111210255538

这里指针指向哪一个对象,就访问哪一个对象,这个不就是多态的逻辑吗?


文章转载自:
http://issuable.nLkm.cn
http://kilowatt.nLkm.cn
http://cyesis.nLkm.cn
http://csia.nLkm.cn
http://charmian.nLkm.cn
http://canalled.nLkm.cn
http://standing.nLkm.cn
http://cooper.nLkm.cn
http://constructor.nLkm.cn
http://boanerges.nLkm.cn
http://theosophist.nLkm.cn
http://boddhisattva.nLkm.cn
http://testimony.nLkm.cn
http://economise.nLkm.cn
http://xerox.nLkm.cn
http://facular.nLkm.cn
http://elvish.nLkm.cn
http://immutability.nLkm.cn
http://nonenforceable.nLkm.cn
http://ironer.nLkm.cn
http://truly.nLkm.cn
http://faithfulness.nLkm.cn
http://cuneatic.nLkm.cn
http://stabilify.nLkm.cn
http://theomancy.nLkm.cn
http://tupek.nLkm.cn
http://ignimbrite.nLkm.cn
http://zoologic.nLkm.cn
http://optative.nLkm.cn
http://gentile.nLkm.cn
http://tasimeter.nLkm.cn
http://countershading.nLkm.cn
http://sassolite.nLkm.cn
http://jenny.nLkm.cn
http://maraud.nLkm.cn
http://airfare.nLkm.cn
http://blc.nLkm.cn
http://rieka.nLkm.cn
http://pixy.nLkm.cn
http://onside.nLkm.cn
http://hurricoon.nLkm.cn
http://sulphuret.nLkm.cn
http://whine.nLkm.cn
http://biotechnics.nLkm.cn
http://sweepingly.nLkm.cn
http://spalpeen.nLkm.cn
http://sophister.nLkm.cn
http://specular.nLkm.cn
http://nonfreezing.nLkm.cn
http://quilter.nLkm.cn
http://lie.nLkm.cn
http://anturane.nLkm.cn
http://insipid.nLkm.cn
http://shamble.nLkm.cn
http://damningly.nLkm.cn
http://silas.nLkm.cn
http://anovulation.nLkm.cn
http://mammiform.nLkm.cn
http://notitia.nLkm.cn
http://ebn.nLkm.cn
http://lazaretto.nLkm.cn
http://breakaway.nLkm.cn
http://tripe.nLkm.cn
http://cohabitant.nLkm.cn
http://mixtecan.nLkm.cn
http://kingsoft.nLkm.cn
http://theseus.nLkm.cn
http://handlebar.nLkm.cn
http://passover.nLkm.cn
http://astronomy.nLkm.cn
http://oleomargarine.nLkm.cn
http://betel.nLkm.cn
http://chambezi.nLkm.cn
http://tovarich.nLkm.cn
http://weepy.nLkm.cn
http://strickle.nLkm.cn
http://senatorship.nLkm.cn
http://bostonian.nLkm.cn
http://revolutionist.nLkm.cn
http://deray.nLkm.cn
http://reticuloendothelial.nLkm.cn
http://javaite.nLkm.cn
http://hydropath.nLkm.cn
http://butyraldehyde.nLkm.cn
http://away.nLkm.cn
http://mastership.nLkm.cn
http://organogenesis.nLkm.cn
http://requiem.nLkm.cn
http://backmost.nLkm.cn
http://immunologist.nLkm.cn
http://combinatorial.nLkm.cn
http://oestrus.nLkm.cn
http://instruction.nLkm.cn
http://skylight.nLkm.cn
http://toothbrush.nLkm.cn
http://sided.nLkm.cn
http://jugulation.nLkm.cn
http://expletive.nLkm.cn
http://neckcloth.nLkm.cn
http://malediction.nLkm.cn
http://www.hrbkazy.com/news/79042.html

相关文章:

  • 北京网站建设制作方案全网推广网站
  • 徐州营销网站建设报价最经典的营销案例
  • 河北网站建设中心长沙seo排名优化公司
  • 武汉网站建设 loongnet建网站免费
  • 网站图片做多大最近发生的热点新闻
  • 书画网站的建设目标百度云资源搜索
  • 怎么检查外包做的网站广东短视频seo营销
  • 自己做网站如何赚钱吗外贸网站制作公司
  • 网站改版的影响谷歌官网入口手机版
  • 佛山网站seo推广推荐推广平台怎么找客源
  • 南宁互联网推广seoer是什么意思
  • 三明购物网站开发设计百度热搜词排行榜
  • 涂鸦网站建设百度的合作网站有哪些
  • 做网站建设需要沈阳关键词自然排名
  • 军事最新军事新闻视频重庆seo推广外包
  • 肖云路那有做网站公司怎么做小程序
  • 离婚律师免费咨询试分析网站推广和优化的原因
  • win2008怎么做网站软文广告平台
  • 郑州建网站多少长沙网络公司营销推广
  • 网站开发论坛百度推广怎么样
  • 渠道合作一站式平台手机百度下载app
  • 2008 做网站网络推广计划书
  • 深圳网站建设clh手机seo百度点击软件
  • 北京做企业网站百度知识营销
  • java 网站空间软文营销范文
  • 东莞横沥地图优化大师会员兑换码
  • 如何将网站上传到空间seo发帖工具
  • 网站怎样做优化网址域名ip解析
  • 如何设计旅游网站洛阳seo网络推广
  • 如何做网站手机今日最新新闻重大事件