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

iis html网站软件开发文档写作

iis html网站,软件开发文档写作,西安网站开发建设,做网站百度百科目录 前言 一、重定向 二、重定向的运用 三、dup2 四、命令行中的重定向 五、为什么要有标准错误 前言 在之前我们学习了文件标识符#xff0c;直到close可以使用文件标识符进行关闭#xff0c;但是当我们关闭1号#xff08;stdout#xff09;时#xff0c;无法往显…目录 前言 一、重定向  二、重定向的运用 三、dup2 四、命令行中的重定向 五、为什么要有标准错误 前言 在之前我们学习了文件标识符直到close可以使用文件标识符进行关闭但是当我们关闭1号stdout时无法往显示器中打印数据这都是文件的重定向在起作用今天我们来一探究竟。 一、重定向  大家看如下代码关闭了fd1stdout根据之前的学习后面打开的 log1.txt 的fd就会设为1。fflush(stdout)我们跟缓冲区有关我们暂时忽略。那么无法往显示器上打印数据数据去哪里了呢 看到结果竟然往log1.txt上面打印了 这是因为printf()函数只认文件描述符1他只会往文件描述符1号上面打印之前 1 为显示器于是往显示器上打印现在显示器被关闭1号变成了文件那么printf也会往1号进行打印也就打印到了文件中。 而这就是重定向这里是输出重定向重定向的本质就是修改特定文件fd的下表里的内容。也就是以前指向原文件后面指向新文件。 其中有一句代码fflush(stdout)很重要如果我们不进行刷新缓冲区那么也不会往log1.txt里面写入数据。这是C语言给我们提供的缓冲区他会将我们打印的内容刷新到对应的fd文件中。因为我们后续会close(fd)文件后续从C语言提供的缓冲区中把数据刷新到fd的时候fd已经关闭也就无法刷新因此这里需要fflush进行刷新再关闭。 二、重定向的运用 那么根据输出重定向追加重定向很很简单了O_TRUNC换成O_APPEND就行。 那我们再看看输入重定向我们使用 fread重定向去读数据。 fread第一个参数为读取的数据放到哪里第二个参数为读取单个单元的大小第三个参数为读取多少单元第四个参数是从哪里读。 我们使用如下代码关闭0号文件那么打开的log1.txt的fd就会被设为0后面fread读取的时候不再会从键盘中读取而是直接冲log1.txt中读取依然是老样子fread认的是文件标识符。  那么结果也是能够预料到的fread从文件中读取了数据。这就是输入重定向 重定向的基本原理上层fd不变底层fd指向的内容发生改变是文件描述表级别的数组里的内容的拷贝。 比如log.txt文件发现 1 号文件描述符无内容他就直接拷贝到1号文件描述符。 三、dup2 但是每次都要用close关闭某个文件这确实有点戳我们可以使用dup2来进行文件描述符表级别的数组里内容的拷贝。 第一个参数为oldfd第二个参数为newfd这局代码会让oldfd进行覆盖newfdoldfd被保留下来。这样文件描述符表数组就会有两个指针指向同一文件了。 当我们使用某个fd进行关闭文件时并不会影响另一个fd这涉及到引用计数也就是有几个指针指向count就为几某个指针取消指向使用close进行释放只会让count-1直到count为0才会释放。  如下代码不再close而是dup2依然可以达到效果 四、命令行中的重定向 我们知道命令行中为输入重定向追加重定向输出重定向 我们拿出之前写的简易版myshell再添加上重定向 简易版myshell代码如下 #includestdio.h#includestdlib.h#includeunistd.h#includestring.h#define NUM 1024#define SIZE 64char* getUsername(){char* env getenv(USER);if(env) return env;return NULL;}char* getHostname(){char* env getenv(HOSTNAME);if(env) return env;return NULL;}char* getPwd(){char* env getenv(PWD);if(env) return env;return NULL;}int main(){while(1){char command[NUM];char* argv[SIZE];int argc 0;printf([%s%s %s]$ ,getUsername(),getHostname(),getPwd());//打印fgets(command,NUM,stdin); //输入完成后还会输入回车导致换行command[strlen(command)-1] \0;argv[argc] strtok(command, );while(argv[argc] strtok(NULL, ));pid_t id fork();if(id 0){//childexecvp(argv[0],argv);exit(1);}else{pid_t rid waitpid(id,NULL,0);if(rid0) printf(等待成功\n);}}} 首先宏定义一下代表各种重定向定义一个全局变量文件名也设置一下  在我们显示基本消息并输入命令后command获取到了命令字符串此时我们就需要判断是否发生重定向 总代码如下 #includestdio.h#includestdlib.h#includeunistd.h#includestring.h#define NUM 1024#define SIZE 64#includectype.h #includesys/stat.h #includefcntl.h #define NUM 1024 #define SIZE 64 #define NoneRedir 0 #define OutputRedir 1 #define AppendRedir 2 #define InputRedir 3 int redir NoneRedir; char* filename NULL; char* getUsername(){char* env getenv(USER);if(env) return env;return NULL;}char* getHostname(){char* env getenv(HOSTNAME);if(env) return env;return NULL;}char* getPwd(){char* env getenv(PWD);if(env) return env;return NULL;}#define SkipSpace(filename) do{ while(isspace(*filename)) filename; }while(0)void checkRedir(char command[],int len){char* end command len -1;char* start command;while(endstart){// ls -al log.txtif(*end ){//ls -al log.txtif((*end-1)){*(end-1) \0;filename end1;SkipSpace(filename);redir AppendRedir; break;}else{*end \0;filename end 1;SkipSpace(filename);redir OutputRedir;break;}}else if(*end ){*end \0;filename end1;SkipSpace(filename);redir InputRedir;break;}else{end--;}}}int main(){while(1){redir NoneRedir; filename NULL;//显示消息并输入char command[NUM];char* argv[SIZE];int argc 0;printf([%s%s %s]$ ,getUsername(),getHostname(),getPwd());//打印fgets(command,NUM,stdin); //输入完成后还会输入回车导致换行command[strlen(command)-1] \0;//判断是否发生重定向checkRedir(command,strlen(command));//分割字符串argv[argc] strtok(command, );while(argv[argc] strtok(NULL, ));pid_t id fork();if(id 0){//childint fd 0;if(redir InputRedir){fd open(filename,O_RDONLY);dup2(fd,0);}else if(redir OutputRedir){fd open(filename,O_WRONLY | O_CREAT | O_TRUNC, 0666); dup2(fd,1);}else if(redir AppendRedir){fd open(filename,O_WRONLY | O_CREAT | O_APPEND, 0666); dup2(fd,1);}execvp(argv[0],argv);exit(1);}else{pid_t rid waitpid(id,NULL,0);if(rid0) {};}}} 我们的代码中先进行的重定向再进行了程序替换这并不会影响因为是进程的PCB中的指针指向的文件结构体文件结构体中有文件标识符表文件标识符表进行了重定向。 而程序替换也是进程PCB中的一个指针指向的虚拟内存空间通过页表映射到物理内存程序替换是物理内存代码与数据的覆盖并不会改变进程pid也不会变依然是原来的进程。那就也不必提PCB里面的内容了。 五、为什么要有标准错误 我们之前的重定向一直在重定向0号stdin和1号stdout为什么还要有2号(stderr)呢 大家看如下代码打印结果也符合预期都是往显示器上打印。  可是当我们将执行内容重定向到log.txt时发现hello stderr没有被重定向而是仍然输出在屏幕上 这是因为我们在进行输出重定向的时候将1号文件标识符区域进行了覆盖不管2号文件描述符什么事情因此stderr老样子维持不动。  如果我们非要将标准输出和标准错误的内容都放到log.txt里则需要在后面添加 21 。这句代码的意思是将1里面的内容放到2号文件描述符里由于1号文件描述符已经被 log.txt 覆盖了因此2好描述符相当于也被 log.txt 覆盖也就都打印到了log.txt里面 为什么这这样写可以呢因为 ./myfile log.txt 其实上是 ./myfile 1 log.txt 。代表将log.txt里的内容放到1号文件描述符中。21 也是同理1号地址的内容放到2号 这样设计的目的是让一个程序在运行时将标准输出和标注错误放到不同的文件中方便我们排查错误如下就打印到了分别的两个文件中。
http://www.pierceye.com/news/60098/

相关文章:

  • 小金县建设局网站网站分辨率
  • 网站营销的重点建立网站ftp
  • 3322做网站网页图片居中怎么设置
  • 网站后台怎么上传文件wordpress谷歌慢
  • 网站建设用模板网站设计报价单
  • 网络公司怎么做网站招标网站哪个好用
  • 如何做pc网站适配企业所得税什么时候交
  • 网站权重宁夏网站seo
  • 诸暨网站制作公司 网页帮你做决定的网站
  • 番禺网站建设电子商务网站建设与维护总结
  • 山西城乡和住房建设厅网站seo推广具体做什么
  • 广州知名网站建设哪家好网站建设公司选哪个好
  • 做小说网站做国外域名还是国内的好中国企业500强2018
  • 河南省漯河建设局网站免费空间最大的云盘
  • 沈阳网站建设找思路装修公司哪家好兰州的
  • 登烈建站wordpress后台登陆地址修改
  • 公司做网站做什么类型的网站好dedecms建手机网站流程
  • 做网站常用的英文字体雕刻机做外贸都是哪些网站
  • 网站开发人员的职业要求彩票网站开发违法
  • 如何搭建网站建设环境广州seo公司排行
  • 铜陵网站建设wordpress能做商城
  • 做平面设计素材的哪个网站好枣强网址建站
  • 小企业网站建设平台有限责任公司公司章程范本
  • 做微网站需要域名吗做机械的有什么网站
  • 扶余市建设局网站网站制作方案垂直领域获客
  • 营销型网站能解决什么问题长春网站建设专业公司
  • 广州哪里有学做网站的wordpress 热门头条
  • 企业网站软件开发东莞网站优化是什么
  • 江门网站建设报价自建房平面图设计软件
  • 天津网站建设服务电话网站关键词多少个字数 站长网