频道栏目
首页 > 资讯 > 其他 > 正文

《UNIX环境高级编程》笔记--文件共享

17-09-06        来源:[db:作者]  
收藏   我要投稿

1.文件共享

内核使用3种数据结构来表示打开的文件,他们的关系如下:

每个进程都有一张进程表项,记录进程打开的文件:

fd标志:close_on_exec,若一个文件描述符在close_on_exec中的对应比特位被设置,那么在执行execl函数时该描述符将被关闭,

即在execl函数执行的程序中直接使用该描述符,则会出错(但是如果是子进程,则仍然可以使用该FD,不管close_on_exec设置

成什么);否则该描述符将始终处于打开状态,即在在execl函数执行的程序中可以直接使用该描述符。

文件指针:指向文件表。

文件表:

文件状态标志:read,write,append,sync等,即open的flag参数。

当前文件偏移量:当执行了write后,当前文件偏移量就增加了相应的长度,如果偏移量超过了文件的长度,则将i节点表中的当前

文件长度设置为文件偏移量。当使用O_APPEND打开文件后,首先将文件偏移量设置为i节点表中的当前文件长度。

v节点指针:指向v节点表。

v节点表:

v节点包含了文件类型和对此文件进行各种操作的函数指针。

v节点还包含了该文件的i节点(i-node)。

(linux没有使用v节点,只使用了通用i节点结构,这2种实现上有所不同,但是概念上是一样的)

上图表示一个进程打开了2个不同的文件,一个是标准输入,一个是标准输出。

下图表示2个不同的进程打开同一个文件。

2.dup和dup2函数

这2个函数是用来复制一个现存的文件描述符,函数的定义如下:

view plaincopy

#include

intdup(intfiledes);//复制filedes,并返回新的filedes(该文件描述符是当前可用文件描述符中最小值),如出错,返回-1

intdup2(intfiledes,intfiledes2);

//使用filedes2复制filedes,如果filedes2已经打开,则先关闭它;如果filedes等于filedes2,则返回filedes2,而不关闭它。

下图显示了执行如下语句的结果:(假设当前可用文件描述符的最小值是3)

newfd = dup(1);

复制一个文件描述符的另一种方法是使用fcntl函数,这个函数会在以后进行介绍。

相关TAG标签
上一篇:C语言关键字及说明
下一篇:《UNIX环境高级编程》笔记--open函数,create函数,close函数
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站