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

辽宁建设厅投诉网站建设网站建设白度经验

辽宁建设厅投诉网站,建设网站建设白度经验,龙岩律师在线咨询,做网站筹钱需要多少钱#x1f525;#x1f525; 欢迎来到小林的博客#xff01;#xff01;       #x1f6f0;️博客主页#xff1a;✈️林 子       #x1f6f0;️博客专栏#xff1a;✈️ Linux之路       #x1f6f0;️社区 :✈️ 进步学堂       #x1…         欢迎来到小林的博客       ️博客主页✈️林 子       ️博客专栏✈️ Linux之路       ️社区 :✈️ 进步学堂       ️欢迎关注点赞收藏✍️留言 目录 系统文件I/O函数介绍open函数返回值文件描述符fd为什么文件描述符从0开始重定向的实现原理不同的文件怎么输入输出到不同的设备 文件描述符的验证文件描述符的继承 系统文件I/O函数介绍 我们C语言有fopenfwritefread等接口来进行文件访问。其根本原因还是进行了一层系统调用使用了系统提供的接口。所以我们可以直接使用系统的接口来进行文件的访问操作。 再此之前需要先介绍俩个函数。 open int open(const char *pathname, int flags, mode_t mode); 其中 pathname代表要写入的字符串flags就是要对文件进行的操作mode_t mode 是一个八进制的权限值。如果文件打开失败会返回-1打开成功则返回文件的fd值 write ssize_t write(int fd, const void *buf, size_t count); fd就是文件的fd值buf就是要写入的字符串。count就是要写入的字符数量。而返回值是实际写入的数量。 所以我们可以写这样一份代码 #include stdio.h #include unistd.h #include sys/types.h #include string.h #include sys/stat.h #include fcntl.hint main() { int fd open(logo,O_WRONLY | O_CREAT,0664);//O_WRONLY写O_CREAT如果文件不存在就创建 if(fd 0) //打开文件失败open会返回-1 {perror(fail\n);return 1; }int count 5; const char* str hello linux\n; int len strlen(str); while(count--)write(fd,str,len); // 往fd的位置写文件close(fd);return 0; } 如何运行看看结果。 我们可以发现再运行这个程序之后。我们就会文件里写入程序中指定的内容。 那么再为大家介绍一个系统接口。 read 使用方法和write一样只不过write是写read是读。 代码: #include stdio.h #include unistd.h #include sys/types.h #include string.h #include sys/stat.h #include fcntl.hint main() {int fd open(logo,O_RDONLY);if(fd 0) //打开文件失败open会返回-1{perror(fail\n);return 1;}int count 5;const char* str hello linux\n;int len strlen(str);char buff[1024] {0};while(read(fd,buff,len) 0) //把文件的数据读到buff中{printf(%s,buff);//打印读取的数据}close(fd);return 0; } 而close就是关闭文件的意思。open打开文件close关闭文件。 open函数返回值 在认识返回值之前先来认识一下两个概念: 系统调用 和 库函数。 上面的 fopen fclose fread fwrite 都是C标准库当中的函数我们称之为库函数libc。而 open close read write lseek 都属于系统提供的接口称之为系统调用接口 系统调用接口和库函数的关系一目了然。 所以可以认为f系列的函数都是对系统调用的封装方便二次开发。 文件描述符fd 通过对open函数的学习我们知道了文件描述符就是一个小整数 open打开文件时会返回这个文件描述符那么我们来看看这个文件描述符是多少呢 那我们就用下面这段代码来观察每个打开文件的文件描述符。 #includestdio.h #includefcntl.h #includesys/types.h #includesys/stat.h #includeunistd.hint main() {int fd1 open(./log.txt,O_WRONLY | O_CREAT);int fd2 open(./log1.txt,O_WRONLY | O_CREAT);int fd3 open(./log2.txt,O_WRONLY | O_CREAT);int fd4 open(./log3.txt,O_WRONLY | O_CREAT);int fd5 open(./log4.txt,O_WRONLY | O_CREAT);printf(fd1 : %d\n, fd1);printf(fd2 : %d\n, fd2);printf(fd3 : %d\n, fd3);printf(fd4 : %d\n, fd4);printf(fd5 : %d\n, fd5);return 0; } 编译后我们发现对应的fd(文件描述符)值是 3 4 5 6 7 我们可以看到是一个连续的整数数列。那么这下就有点好奇了为什么文件描述符从3开始 而不是从0 或者1 开始。 答案是每个进程执行时会默认打开三个文件。 这三个文件就是 stdin(标准输入) stdout(标准输出) stderr(标准错误) 。 而它们三个对应的fd值分别就是 0 1 2。所以后续打开的文件会从3开始。 所以我们还可以这样子输入输出: #include stdio.h #include unistd.h #include sys/types.h #include string.h #include sys/stat.h #include fcntl.hint main() {const char* print print\n;char buff[1024]; write(1,print,strlen(print)); //把 print写到显示器read(0,buff,1024); //把 键盘的字符串 读到buff里buff[strlen(buff)-1] \0; //因为输入会录入回车。把回车换成\0printf(input:%s\n,buff);return 0; }运行结果 为什么文件描述符从0开始 现在知道文件描述符就是从0开始的小整数。为什么从0 开始 我们不妨思考一下从0开始的连续的整数。像什么 是不是很像数组的下标 没错fd值对应的就是数组下标 在每个进程控制块(PCB) 中 都有一个指针*files指针指向一张表files_struct 。这是因为当进程打开文件时操作系统需要创建相应的数据结构来描述这些文件。 而在 files_stuct表中有一个最重要的部分那就是一个指针数组这个数组中的每一个元素都是一个指向当前进程已经打开了的文件的指针所以本质上文件描述符就是这个数组的下标只要拿着文件描述符就可以找到对应的已打开的文件 fd的本质是内核中是进程和文件关联的数组的下标。 而我们一个进程可以打开多个文件。所以 **进程:文件 1 : n **。进程和文件是一对多的关系。 所以我们也可以直接往 1(标准输出)里面写 一样可以在显示器打印结果。 #includestdio.h #includefcntl.h #includesys/types.h #includesys/stat.h #includeunistd.hint main() {char buff[] hello file\n;write(1,buff,sizeof(buff)-1);return 0; } 我们编译运行一下。 那我们再来玩一个好玩的我们把标准输入关掉。然后在打开文件文件描述符还是3 吗 #includestdio.h #includefcntl.h #includesys/types.h #includesys/stat.h #includeunistd.hint main() {close(0);int fd1 open(./log.txt,O_WRONLY | O_CREAT);printf(fd1 %d\n,fd1);return 0; }我们会发现新打开的文件它的fd值是0。 也就是我们把 标准输入关掉之后 0 这个下标的位置空出来了而这个时候打开文件那么就会往最前面的空位找。 结论文件描述符的分配规则是从头开始找下第一个空位分配。 重定向的实现原理 那再玩一个好玩的把文件描述符1关掉呢会发生什么 #includestdio.h #includefcntl.h #includesys/types.h #includesys/stat.h #includeunistd.hint main() {close(1);int fd1 open(./log.txt,O_WRONLY | O_CREAT);printf(fd1 %d\n,fd1);return 0; }我们编译运行 我们发现运行没有打印任何信息但是 我们在log.txt 发现了 fd1 1这个信息。这本是我们要打印在屏幕上的信息为什么输出到了文件中呢 这是因为printf函数不管你是标准输出还是你自己打开的文件。它只负责往文件描述符为1的文件里写入。当我们关掉了标准输出打开了新的文件log.txt时printf函数还是理所当然的往fd为1的文件写入。然而此时文件描述符为1的文件早已不是我们的标准输出了而是我们新打开的文件所以就写入了我们新打开的文件。 而重定向的原理也是如此。 不同的文件怎么输入输出到不同的设备 我们都知道每个 file文件都是write和read接口。那么它怎么知道我要从键盘读它怎么知道我要从键盘读取 这就要用到多态的原理了。首先我们得有个虚函数表存放的是对应的read/write函数的函数指针。这样文件就可以通过函数指针找到对应的外设进行该外设的读写操作。 文件描述符的验证 C语言中的FILE* 结构体一定包含了文件描述符 为什么这么说呢 因为任何语言你想要使用外设设备。都必须要经过操作系统的同意而你的标准输入输出会访问键盘和显示器 所以也必须经过操作系统的同意 因为操作系统不信任任何人只相信自己所以操作系统会提供一层系统调用接口。 通过调用系统调用接口由操作系统去访问外设。 所以 C语言中的FILE* 文件结构体一定包含了文件描述符。怎么验证呢我们可以访问结构体成员**_fileno** 来获取文件描述符因为这个成员存取的就是文件描述符。 #includestdio.h #includefcntl.h #includesys/types.h #includesys/stat.h #includeunistd.hint main() {FILE* f fopen(./log.txt,w);printf(fd1 %d\n,f-_fileno);return 0; } 随后编译输出 输出的新打开文件的文件描述符是3。 文件描述符的继承 如果当父进程fork出了一个子进程之后那么子进程会继承父进程的文件描述符吗 答案是一定会 因为子进程是以父进程的模板创建的。子进程会单独复制一份file_struct 出来 而不是和父进程共享。 所以我们也可以解释一下为什么每个进程执行的时候都会默认打开标准输入标准输出标准错误三个文件 这一切都是因为这些进程继承了父进程的file_struct。而每个执行的进程的父进程都是bashbash是命令行解析器。输入命令时我们需要标准输入流而标准输出用来返回输入命令的结果。标准错误用来返回报错。 一个进程可以打开多个文件一个文件也可以被多个进程打开。在这里会用到一个引用计数的计数。文件每被一个进程打开就会计数一次。被一个进程关闭就会减少一次。直到为0时操作系统才会真正关闭这个文件。
http://wiki.neutronadmin.com/news/291305/

相关文章:

  • 口碑好的昆明网站建设免费的短视频app有哪些
  • wordpress如何看访问量湛江seo哪家好
  • 个人如何做公益网站昆山建设公司网站
  • 网站怎么做微博认证网络舆情监测与研判
  • 鞍山制作网站哪家好wordpress下载最新
  • 建设网站的步骤seo南昌旅游集团网站建设
  • 网站建设合同是否交纳印花税小程序加盟平台
  • seo站长教程ui设计是什么部闿
  • 校园论坛网站怎么做微网站建设服务商
  • 优化网站设计有哪些方法网上建立公司网站
  • 做移动网站优化软件网站建设主要包括哪些
  • WordPress手机站插件建站行业都扁平化设计
  • 网站建设怎样核算青岛比较知名的网站建设公司
  • 能发外链的网站wordpress 注册审核
  • 网站做下载页面网站地图seo
  • 招商网站的建设目的wordpress 模板修改
  • 高端做网站北滘高明网站建设
  • 网站建设需要报告wordpress模板 段子
  • 做网站的工作北京seo优化wyhseo
  • 做网站优化常用工具建设一个网站平台的费用吗
  • 建设网站一般多钱php网站开发案例论文
  • 免费的个人主页网站系统管理在哪里
  • 企业名录软件网站可以同时做竞价和优化吗
  • 厦门建设服务管理中心网站多用户商城网站建设二次开发
  • 怎么样做一个自己的网站wordpress 模版制作
  • 提供网站建设在线logo制作生成免费网站
  • 沈阳德泰诺网站建设公司成都网站制作售后
  • 做仓单的网站百度制作网页需要多少钱
  • 网站规划与设计一千字网络营销swot分析
  • 计算机网络工程网站建设网站如何做播放线路