“Unix 中所有的东西 就是文件!”那个家伙也许正在说到一个事实:Unix 程序在执行任何形式的 I/O 的时候, 程序是在读或者写一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数。 但是(注意后面的话),这个文件可能是一个网络连接,FIFO,管道,终端,磁盘上的文件 或者什么其他的东西。Unix 中所有的东西是文件!因此,你想和 Internet 上别 的程序通讯的时候,你将要通过文件描述符。最好相信刚才的话。
现在你脑海中或许冒出这样的念头:“那么我从哪里得到网络通讯的文件描述符呢,聪明 人?”无论如何,我要回答这个问题:你利用系统调用 socket()。他返回套接口描 述符 (socket descriptor),然后你再通过他来调用 send() 和 recv()。
“但是...”,你可能现在叫起来,“如果他是个文件描述符,那么为什么不用一般的调用 read() 和 write() 来通过套接口通讯?”简单的答案是:“你可以使用 一般的函数!”。详细的答案是:“你可以,但是使用 send() 和 recv() 让你更好的控制数据传输。”

对于文件描述符的初识。APUE中是这样介绍文件描述符的(APUE  p59):对于内核而言,所有打开的文件都通过文件描述符引用,文件描述符是一个非负整数,当打开一个现有或创建一个新的文件的时候,内核回想进程返回一个文件描述符,当读或者写一个文件时,使用open或creat返回的文件描述符标识该文件,将其作为参数传递给read或write。

       posix中,定义文件描述符0,1,2分别为:STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO.这些定义在<unistd.h>中。
       关于文件描述符的优缺点:(来自维基百科)
       优点:
  • 基于文件描述符的I/O操作兼容POSIX标准。
  • 在UNIX、Linux的系统调用中,大量的系统调用都是依赖于文件描述符。

缺点:

  • 在非UNIX/Linux操作系统上(如Windows NT),无法基于这一概念进行编程。
  • 由于文件描述符在形式上不过是个整数,当代码量增大时,会使编程者难以分清哪些整数意味着数据,那些意味着文件描述符。
由于posix中定义的宏占用了0,1,2这三个文件描述符,所以,当调用能过返回文件描述符的系统调用时一般都是从3开始进行分配。
以上只是对文件描述符的简单认识,其实一直很郁闷的是文件描述符只是一个int型的整数,如何通过它来对存在磁盘上的文件进行操作。通过进一步了解发现,其实在每个进程中都维护着一张文件描述符表,这张表中的文件描述符对应着一个文件指针,可以找到这个文件描述符所对应的文件,如果没有分配的文件描述符其所对应的指针为NULL。而文件指针中的inode成员便记录了该文件所对应的inode节点。

而很多系统调用都是通过对这个文件指针的操作来进行的。

|--------|------------|                   |--------------------|
|   fd     |文件指针 |-------------> |   文件状态标志   |
|--------|------------|                   |--------------------|                        
|--------|------------|                   |当前文件偏移量 |
|   ...     |   ....         |                   |--------------------|
|--------|------------|                   |inode节点指针   |--------------------------->|-----------------------------|
                                            |--------------------|                                     | inode节点信息             |
                                                                                                            |----------------------------|

当某个程序打开文件时,操作系统返回相应的文件描述符,程序为了处理该文件必须引用此描述符。所谓的文件描述符是一个低级的正整数。最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应。因此,函数 scanf() 使用 stdin,而函数 printf() 使用 stdout。你可以用不同的文件描述符改写默认的设置并重定向进程的 I/O 到不同的文件。

1、首先说什么是文件描述符,它有什么作用?
文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。
  
文件描述符
是个很小的正整数,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。 
  文件描述符的优点:兼容POSIX标准,许多
Linux

UNIX
系统调用都依赖于它。
  文件描述符的缺点:不能移植到UNIX以外的系统上去,也不直观。
    基于文件描述符的输入输出函数:
  open:打开一个文件,并指定访问该文件的方式,调用成功后返回一个文件描述符。
  creat:打开一个文件,如果该文件不存在,则创建它,调用成功后返回一个文件描述符。
  close:关闭文件,进程对文件所加的锁全都被释放。
  read:从文件描述符对应的文件中读取数据,调用成功后返回读出的字节数。
  write:向文件描述符对应的文件中写入数据,调用成功后返回写入的字节数。
  ftruncate:把文件描述符对应的文件缩短到指定的长度,调用成功后返回0。
  lseek:在文件描述符对应的文件里把文件指针设定到指定的位置,调用成功后返回新指针的位置。
  fsync:将所有已写入文件中的数据真正写到磁盘或其他下层设备上,调用成功后返回0。
  fstat:返回文件描述符对应的文件的相关信息,把结果保存在struct stat中,调用成功后返回0。
  fchown:改变与打开文件相关联的所有者和所有组,调用成功后返回0。
  fchmod:把文件描述符对应的文件的权限位改为指定的八进制模式,调用成功后返回0。
  flock:用于向文件描述符对应的文件施加建议性锁,调用成功后返回0。
  fcntl:既能施加建议性锁也能施加强制性锁,能建立记录锁、读取锁和写入锁,调用成功后返回0。
  dup:复制文件描述符,返回没使用的文件描述符中最小的编号。
  dup2:由用户指定返回的文件描述符的值,用来重新打开或重定向一个文件描述符。
  select:同时从多个文件描述符读取数据或向多个文件描述符写入数据

2012年12月21日相关推荐

  1. 2012年12月21日所谓世界末日时做的第一个五年规划——成为领域内的专家

    五年规划步骤: 1.在基础还没打牢之前大量的看相关技术书籍(没有选择性,不求甚解,只在量上),练完英语和数学就看 2.不定期的了解技术前沿的情况 3.根据自己的爱好选择需要精专的技术领域,仍然是大量阅 ...

  2. 2017年度盘点:15个最流行的GitHub机器学习项目 By 机器之心2017年12月21日 15:23 在本文中,作者列出了 2017 年 GitHub 平台上最为热门的知识库,囊括了数据科学、机

    2017年度盘点:15个最流行的GitHub机器学习项目 By 机器之心2017年12月21日 15:23 在本文中,作者列出了 2017 年 GitHub 平台上最为热门的知识库,囊括了数据科学.机 ...

  3. 荒野行动8月1日服务器维护,荒野行动手游12月21日服务器维护到几点 12月21日具体开服时间公告...

    荒野行动手游在这圣诞节来临前又有给玩家带来一次大更新,这次更新给玩家带来了全新的雪天模式,可以说雪天模式可能会颠覆这个游戏的一些玩法,很多玩家都想第一时间就进入游戏中体验一番,但是今天早上荒野行动并 ...

  4. 日期转换 例如 二零零六年十二月二十一日 转换成 2006年12月21日

    日期转换  例如 二零零六年十二月二十一日 转换成 2006年12月21日 class Program{static void Main(string[] args){//编写一个函数进行日期转换,将 ...

  5. 【12月21日】A股滚动市盈率PE历史新低排名

    2010年01月01日 到 2018年12月21日 之间,滚动市盈率历史新低排名. 上市三年以上的公司,2018年12月21日市盈率在300以下的公司. 1 - 厦门象屿(SH600057) - 历史 ...

  6. 荒野行动服务器维护什么时候好,荒野行动12月21日服务器维护到几点 12月21日具体开服时间公告...

    荒野行动12月21日更新到什么时候,为什么还没有开服,荒野行动在12月21日移动端和PC端同步更新,公告上表示在北京时间12月21日早晨4点~8点,进行停服维护,但是为什么已经超过了时间还没有开服呢? ...

  7. 灵山奇缘服务器维护,灵山奇缘 12月21日每周例行维护公告

    亲爱的玩家: 缘起灵山,以爱相生,腾讯首款国风造物回合网游<灵山奇缘>"天降奇缘"公测版本现已开启,点亮三大回合"缘份",带来奇妙浪漫的三界之旅.在 ...

  8. 赛尔号星球大战服务器维修,《赛尔号星球大战》12月21日停服更新公告

    各位亲爱的赛尔: <赛尔号星球大战>12月21日凌晨00:00进行停服更新,更新时间预计为00:00至2:00.如遇特殊情况,导致既定时间内无法完成更新,开服时间将会顺延,请各位赛尔合理安 ...

  9. 2021阿里云弹性计算年度峰会将于12月21日开启线上直播,五大看点不容错过

    从2009年阿里云成立开始,到2010年推出首个弹性计算产品ECS,到2017年虚拟化架构零损耗的神龙架构横空出世,再到2021年发布计算巢生态战略,帮助合作伙伴云化升级:十二年,阿里云初心未改,一直 ...

最新文章

  1. 深度学习实现NBA球星颜值打分完整案例(二)
  2. 【面试经验分享】Java 面试中的那些潜规则
  3. python安装vpython_VPython:一个Python的3D图形动画库+被忽略的数据可视化功能
  4. [深度学习基础] 5. 实现细节
  5. 第四话 想不到办法,就研究规律 ver1.0
  6. 讨论了好久的问题,IE、Firefox下CSS图片垂直居中的问题
  7. CentOS四种方法自建yum仓库
  8. JMeter之HTTP请求上传文件/上传图片
  9. C#算法设计排序篇之04-选择排序(附带动画演示程序)
  10. 与用户交互、格式化输出、基本运算符
  11. mac navicat 安装
  12. wifi共享精灵2014最新版 v04.25.001 官方正式版
  13. 触摸屏一体机的类型有哪些
  14. 多项式秦九韶算法c语言
  15. linux 温度测试软件,linux上安装cpu温度监控软件
  16. 创业之前必须要做的八个测试
  17. 你有一份七夕赚钱指南等待签收
  18. Redis中使用Lua脚本(续)- Linux下Lua-cjson开源库的安装和使用
  19. 如何查看vue打印的console.log日志
  20. Android 仿抖音视频播放列表和评论列表

热门文章

  1. pipenet.v9.0(Spray V3.40,Standard V3.4,Transient V5.3)
  2. 2021年安全员-A证考试题及安全员-A证实操考试视频
  3. 安智汽车完成数千万元 A+轮融资,加速进入量产落地快车道...
  4. 深度解读Netty:java读取邮件放到Excel
  5. Java 是编译型还是解释型语言
  6. 机器学习基础知识(一):梯度下降,L2,L1,L0范数
  7. Linux操作系统源码解读
  8. mysql(二)--select语法
  9. ArcGIS教程:将支持页面插入地图册
  10. fman后续20210206