您的位置:首页 > 编程语言

三)Unix文件I/O(2)

2015-07-14 20:32 239 查看

粘着位

在Unix系统中,粘着位拥有者丰富的含义:

在早期的Unix系统中,被称作sticky bit,一个可执行程序被设置了粘着位,意味着程序执行完毕后,整个程序(机器码)会被缓存在交换区,通常一般是因为这种可执行程序使用频率很高,相当于起了缓存的作用;

后来的Unix版本中,被称作保存正文位,saved-text bit,即S_ISVTX位的由来;

现今的系统扩展了粘着位的含义,对目录也可以使用粘着位,目录设置了粘着位以后,任何人对这个目录的权限都是读、写和执行,但是无法删除,除非满足以下条件之一:

拥有此文件;

拥有此目录;

超级用户;

函数chown、fchown、fchownat和lchown

int chown(const char *pathname, uid_t owner, gid_t group);

int fchown(int fd, uid_t owner, gid_t group);

int fchownat(int fd, const char *pathname, uid_t owner, gid_t group);

int lchown(const *pathname, uid_t owner, gid_t group);

在符号链接情况下,设置了AT_SYMLINK_NOFOLLOW标志的fchownat和lchown会修改符号链接的所有者和用户组;

fchownat与chown或者lchown在以下两种情况下是具有相同意义的:

pathname为绝对路径

fd=AT_FDCWD,pathname为相对路径

如果设置了AT_SYMBLIC_NOFOLLOW,fchownat和lchown行为相同;

如果清除了AT_SYMBLIC_NOFOLLOW,fchownat和chown行为相同;

如果fd是一个文件描述符,而pathname是相对路径,则会相对于pathname打开fd

各个版本的Unix对chown的控制是不同的,一般以_POSIX_CHOWN_RESTRICTED字段来控制,若_POSIX_CHOWN_RESTRICTED对某文件生效,则:

只有超级用户可以修改此文件的用户ID;

如果进程拥有此文件,且参数group等于进程有效进程组ID或进程的附属组ID之一,则可以修改该文件的用户组ID,但只能改到你所属的组;

文件长度

文件长度只对普通文件、目录文件和链接文件有效,但是FreeBSD、MacOS和Solaris中也对管道定义了长度,表示可以从该管道中读到的字节数;

链接文件的长度等于连接到目录名的字节数;

后来大多数Unix使用st_blksize和st_blocks来表示文件大小,但是不同st_blksize之间的unix程序是不可移植的;

空洞文件实际存储空间是小于文件大小的,原因是其中存储了一些指针,相同的空洞位,但是在读取的时候会用0填充这些区域,所以读取的时候还是实际的大小,甚至略大于,那是因为文件系统使用了若干块存放指向实际数据块的指针;

文件截断

int truncate(const char *pathname, off_t length);

int ftruncate(int fd, off_t length);

如果文件原本长度大于length,则多余的部分就不可以再访问;

如果文件原本长度小于length,则会形成一定长度的补0的空洞;

文件系统(硬链接和软连接)

参考http://blog.csdn.net/hfut_wowo/article/details/43648737

函数link、linkat、unlink、unlinkat和remove

link(const char exisitingpath, const char pathname);

linkat(int efd, const char *exisitingpath, int nfd, const char *newpath, int flag);

对于linkat来说,现有文件是通过efd和exisitingpath来指定的,目标文件是以nfd和newpath来制定。对于两个路径:

如果有任意一个是相对路径,则需要计算;

如果有任意一个flag是AT_FDCWD,则全部是以当前目录来计算;

如果有任意一个是绝对路径,则全部忽略文件描述符参数;

创建连接和增加连接数应该是原子操作;

为了避免循环连接,一般不允许对目录设置硬链接,少数允许的也必须要超级用户;

int unlink(const char *pathname);

int unlinkat(int fd, const *pathname, int flag);

unlink可以作为删除文件来用,等于remove;

当文件连接数为0的时候才可以删除;

unlink的这种特性通常用来保证在程序崩溃时,临时文件也可以被清除,方法就是创建文件并打开后立马调用unlink,这样由于文件处于打开状态,所以并不会被删除,当进程终止时,该文件就会被删除;

在给出链接名的情况下,没有一个函数可以删除该链接指向的文件;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息