UNIX目录与文件
<Uinx 环境高级编程笔记>
文件的相关信息
文件有哪些相关信息呢?
用户关心的:文件类型、文件名、文件大小、文件目录、文件所有者、文件访问修改日期。
这些信息保存在struct stat结构中(sys/stat.h)
系统关心的:文件状态、文件的存储信息。
系统相关的信息大部分在inode, vnode, 文件表中。
获取stat结构的API: int stat(const char * file_name,struct stat *buf);
使用stat函数最多的可能是 ls -l命令
int lstat (const char * file_name.struct stat * buf);
lstat与stat的区别在于,当文件为符号链接时,lstat会返回链接本身的状态。
文件类型
普通文件
目录文件
字符特殊文件
块特殊文件
FIFO
套接口
符号链接
用户ID与组ID
与一个进程相关的ID有六个或更多
1 实际用户ID和实际组ID,标识我们究竟是谁。即当前在使用系统的用户。比如我的用户名是robin(ID是1000),那么我的实际用户ID就是1000。通常在一个登录回话区间这些值是不会改变的。
2 有效用户ID和有效用户组ID -- 决定了我们的文件访问权限。
通常1 和 2是相等的,特殊情况下才不等。特殊情况就是设置了一个特殊标志位(st_mode)。其定义是:当执行此文件时,将进程的有效用户ID设置为文件的所有者( st_uid )。
什么情况需要设置这个位呢?
当某个程序执行时需要root用户权限来完成某些操作,你又希望一般用户可以执行这个程序,这时候就可以通过设置这个标志位来达到这个目的。
怎么设置?
chmod u+s filename (suid)
通常需要先把文件所有者设为root
下面三个函数可以更改uid, gid
int chown(const char * path, uid_t owner,gid_t group);
int fchown(int fd,uid_t owner,gid_t group);
int lchown(const char * path, uid_t owner,gid_t group);//涉及到符号链接时用
文件存取权限
用9个许可权限位表示
owner group others
1 2 3 4 5 6 7 8 9 左到右为读,写,执行
某位为1表示具有相应权限
用chmod命令来设置
u:所有者 g:表示同组用户 o:表示其它用户 +: 表示增加 -: 表示删除(权限)
chmod a+xwr file
chmod a-x file
chmod o+x file
chmod 600 file 所有者有读写权限
chmod 777 file 所有人有读写执行的权限
为了在一个目录中创建一个新文件,你需要有该目录的写权限和可执行权限。
为了删除一个文件,你需要有该文件的写权限和可执行权限。
下面两个函数也允许我们改变现存文件的权限
int chmod(const char * path,mode_t mode);
int fchmod(int fildes,mode_t mode);
access函数,判断文件是否具有存取权限
int access(const char * pathname,int mode);
参数mode有几种情况组合,R_OK,W_OK,X_OK和 F_OK。R_OK,W_OK与 X_OK用来检查文件是否具有读取、写入和执行的权限。返回0表示成功。
umask函数,屏蔽权限位(创建文件时默认关闭哪些权限位)
例如:
umask 0
touch file
那么file将具有如下的权限
-rw-rw-rw-
umask 066
touch file
那么file将具有如下的权限
-rw-------
可以在shell中用,也有umask函数。
文件长度
wc -c file 计算文件中的字节数。
wc, du 命令
文件系统
查看磁盘空间
df -h
硬链接直接指向i节点
link newfile oldfile
ln -s file linkfile -- 符号链接
其它API
目录相关:mkdir, rmdir, chdir, fchdir
文件链接:link, unlink, remove, rename
文件状态:utime
同步:sync, fsync (传统的UNIX实现在内核中设有缓冲存储器,sync同步文件内容和缓存存储器)
对文件的所有属性以及对文件进行操作的所有函数有完整的了解对各种Unix程序的设计都非常重要。
转载于:https://www.cnblogs.com/uvsjoh/archive/2012/06/13/2547226.html