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

辽宁省建设工程招标协会网站在线设计响应式网站

辽宁省建设工程招标协会网站,在线设计响应式网站,目前做网站最好的语言是,有什么做服装的网站好文章目录 一、系统调用接口二、文件调用1. 文件描述符 fd2. 文件调用原理3. FILE 三、重定向dup2 四、缓冲区简易 FILE 的代码实现 文件被加载之前#xff0c;被存在磁盘上#xff0c;操作文件#xff0c;文件的部分内容则会被调度到 内存中。 要分析文件#xff0c;我们也… 文章目录 一、系统调用接口二、文件调用1. 文件描述符 fd2. 文件调用原理3. FILE 三、重定向dup2 四、缓冲区简易 FILE 的代码实现 文件被加载之前被存在磁盘上操作文件文件的部分内容则会被调度到 内存中。 要分析文件我们也把文件分成两种 磁盘上的文件文件系统内存中的文件 这里谈论的是内存中的文件 文件被打开OS 会为被打开的文件创建对应的内核数据结构 struct file将所有这个类型的结构体用某种数据结构链接起来以供 OS 管理。 struct file {// 各种文件属性磁盘中读出来的// 各种链接关系// 缓冲区相关 };一、系统调用接口 主要介绍一个 open #include sys/types.h #include sys/stat.h #include fcntl.h// man 手册查看 man 2 openint open(const char *pathname, int flags)   int open(const char *pathname, int flags, mode_t mode);   参数 pathname 文件名 参数 flags 标志位man 2 手册可查 参数 mode 设置新建文件权限 返回值 为 -1 则说明open 失败非负为 文件描述符见后文 参数 flags O_CREAT | O_WRONLY 如果没有文件则创建生成 默认不会对原始文件内容做清空会从从最开始覆盖 O_CREAT | O_WRONLY | O_TRUNC 如果没有文件则创建生成 清空 写 O_CREAT | O_WRONLY | O_APPEND 如果没有文件则创建生成 追加写 注意在往文件里写入的时候strlen(str) 不要 1因为 ‘\0’ 是 C 语言的结束规定不是文件的规定加进去会乱码。 使用系统接口进行 IO 的时候一定要注意\0 问题 我们 C 语言使用的一系列函数 fopen、fclose、fwrite/fputs、fread/fgets 都是系统函数的封装 open、close、write、read 二、文件调用 1. 文件描述符 fd 任何一个进程在启动的时候默认都会打开三个文件 标准输入 - - 设备文件 - 键盘文件   0 标准输出 - - 设备文件 - 显示器文件   1 标准错误 - - 设备文件 - 显示器文件   2 其中 标准输出 和 标准错误 都会向 显示器 打印但他们其实是不一样的。eg测试中输入受重定向符的影响而错误不受重定向符的影响文件描述符也是 open 对应的返回值。我们创建的文件返回的值是从 3 开始的而 0 1 2 正是被上面默认打开的三个文件占用了。这个数字本质就是 数组下标。 一张简图 进程中文件描述符的分配规则 在文件描述符表中最小的没有被使用的数组元素分配给新文件 fclose(stdin); // 等价于 close(0);2. 文件调用原理 1 个进程 可以调度 n 个文件每个文件都有 一个缓冲区调用 read / write / close 这些系统接口时都需要文件操作符。也就是说在操作系统层面我们必须要访问fd才可以找到文件我们所谓的 IO 类 read / write 函数本质上是 拷贝函数什么时候将缓冲区上的内容刷新到磁盘中指定的位置由 OS 自主决定进程 和 文件 并没有深度耦合便于操作系统的管理 如何理解一切皆文件 每个硬件都有一个 struct file 对象C语言里面没有成员函数使用的就是函数指针完成的众多行为。进程通过 指针数组访问的其实是这些 struct file 对象包括里面的缓冲区、函数指针…而用户的操作实际上都是进程的操作所以我们说Linux 下一切皆文件 3. FILE #include stdio.h extern FILE *stdin; extern FILE *stdout; extern FILE *stderr;FILE *fopen(const char *path, const char *mode);这里的 FILE * 是 结构体类型由 C语言提供的跟内核的 struct file 没有任何关系。 我们指定在操作系统层面我们必须要访问 fd才可以找到文件。也就是说 struct FILE 里面必定封装了 fd。 我们来看 FILE 源码是这样写的 typedef struct _IO_FILE FILE; 在/usr/include/stdio.hstruct _IO_FILE {//...int _fileno; //封装的文件描述符就是我们说的 fd// C语言维护的缓冲区相关内容//... };测试如下 print(%d\n, stdin-_fileno); print(%d\n, stdout-_fileno); print(%d\n, stderr-_fileno); FILE *fp fopen(test.txt, w); print(%d\n, fp-_fileno);-------- 输出结果 0 1 2 3三、重定向 输出重定向举例 close(1); int fd open(test.txt, O_WRONLY | O_CREAT | O_TRUNC, 0666); // fd 1printf(hello\n); // stdout - 1 printf(hello\n); printf(hello\n);--------- hello hello hello 字样被保存进了 test.txt 中输入重定向举例 close(0); int fd open(test.txt, O_RDONLY); // fd 0int a,b; scanf(%d %d, a, b); // stdin - 0 printf(a %d, b %d\n, a, b);--------- 在 test.txt 文件中写入 123 456 运行程序后输出 a 123 b 456追加重定向举例 close(1); int fd open(test.txt, O_WRONLY | O_CREAT | O_APPEND, 0666); // fd 1printf(hello\n); // stdout - 1 printf(hello\n); printf(hello\n);--------- 运行两次则有 hello hello hello hello hello hello 字样被保存进了 test.txt 中回头看之前的问题 其中 标准输出 和 标准错误 都会向 显示器 打印但他们其实是不一样的。 eg测试中输入受重定向符的影响而错误不受重定向符的影响原因如下 stdout、cout - 他们都是向 1 号文件描述符对应的文件打印 stderr、cerr - 他们都是向 2 号文件描述符对应的文件打印。 输出重定向时更改的只是 1 号对应的指向2 号未被影响。 当我们需要手动分离一个程序正确和错误信息的时候 ./a.out 1log.txt 2err.txt当然也有直接的函数可以使用 dup2 头文件 #include unistd.hint dup2(int oldfd, int newfd);   参数 oldfd 最后需要的 fd 参数 newfd 需要被覆盖的 fd 相当于把本应该到 newfd 上的重定向到 oldfd最后剩下的只有 oldfd 四、缓冲区 C 语言维护的 FILE 结构体 和 OS 维护的 struct file 结构体都有自己的缓冲区每个对象都有自己的缓冲区这两个缓冲区是不相同的。 C库提供的刷新策略一般有三种 无缓冲行缓冲遇到 \n 刷新全缓存缓冲区满了刷新 显示器采用的刷新策略行缓冲 普通文件采用的刷新策略全缓冲 缓冲区的作用节省调用者的时间 这会产生一些奇怪的现象 // c 库 fprintf(stdout, hello fprintf\n); // os 系统调用 const char *msg hello write\n; write(1, msg, strlen(msg));fork();这个程序我们在 linux 下重定向到文件会出现如下情况 [xxxhostname file]$ ./a.out hello write hello fprintf [xxxhostname file]$ ./a.out test.txt [xxxhostname file]$ cat test.txt hello write hello fprintf hello fprintf [xxxhostname file]$第一个运行容易理解分析第二次 cat 文件内容出现的结果 原因如下 首先write 正常调用输出到显示器fprintf 的缓冲区对于重定向到普通文件使用全缓冲这里的内容显然不能将缓冲区填满所以进程结束时刷新一直到 fork 被调用程序还没结束此时父子进程的缓冲区里都有一份 hello fprintf。谁先结束谁就先写诗拷贝刷新到屏幕上于是被打了两次 简易 FILE 的代码实现 链接如下 如果本文对你有些帮助请给个赞或收藏你的支持是对作者大大莫大的鼓励(✿◡‿◡) 欢迎评论留言~~
http://www.hkea.cn/news/14269512/

相关文章:

  • 专业重庆房产网站建设推荐几个没封的正能量网站
  • 长沙做网站 必看 磐石网络wordpress关闭注册激活邮件
  • 珠海门户网站建设公司宝宝身上出现很多小红疹怎么办
  • 金华英文网站建设长沙好的seo外包公司
  • 阿里云自助建站教程qq音乐wordpress
  • 济南建网站公wordpress错位
  • 大汉网站开发wordpress图片搬家
  • 网络服务器与网站建设网页设计技术论文
  • 广州专业网站html个人网站
  • 网站建设及运营服务流程cms访问状态异常怎么处理
  • 西宁建设厅培训中心网站西平县住房和城乡建设局网站
  • 上海企业网站推广上海营业执照查询网上查询
  • wordpress打开网站打不开php如何做局域网的网站建设
  • 做网站是用什么软件做的oa手机版下载
  • 网站的建设与管理的心得体会购物软件app排行榜前十名
  • 贵州建设厅网站首页二级建造师成绩查询网站建设标志头像图片
  • 长沙市网站制作公司园林景观设计公司设计理念
  • 长沙住房建设部网站沈阳方正建设监理网站
  • 网站选服务器文件专业商城网站建设
  • 网站的管理跟新维护有哪些免费建造网站系统
  • 专门做女性产品的网站廊坊企业建站
  • 网站部分乱码wordpress模版做网页
  • 山东省建设工会网站湖南网站设计
  • 建设行政主管部门政务网站wordpress数据库加密
  • 电子商务毕业设计设计网站建设支部品牌建设
  • 雅安市建设工程招投标网站四川展览设计公司
  • 泉州惠安网站建设wordpress如何设置404页面
  • 一个网站做无限关键词如何建立自己推广网站
  • 网站建设付款页面wordpress增加菜单
  • 怎么样做外链推广网站wordpress 免费 模板下载