粘着位
在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,这样由于文件处于打开状态,所以并不会被删除,当进程终止时,该文件就会被删除;
- 在给出链接名的情况下,没有一个函数可以删除该链接指向的文件;