Linux 文件属性设置
1 stat、fstat、lstat 函数
int stat(const char *pathname , struct stat*buf);
int fstat(int filedes, struct stat*buf);
int lstat(const char *pathname, struct stat*buf);
功能:返回文件的许可权,大小等相关信息。
stat 返回一个与 pathname 命名文件有关的信息结构。fstat 获得已经在文件描述符 filedes 上打开的文件的有关信息。lstat 返回的是符号连接的有关信息。
Buf 指向一个结构,这些函数填写此结构。
struct stat{
mode_t st_mode;
ino_t st_ino;
dev_t st_dev;
dev_t st_rdev;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
off_t st_size;
time_t st_atime;
time_t st_mtime;
time_t st_ctime;
long st_blksize;
long st_blocks;
};
上面结构中的 st_mode 包含了对文件的存取许可权位,每个文件有9个存取许可权如下:
S_IRUSR 用户-读
S_IWUSR 用户-写
S_IXUSR 用户-执行
S_IRGRP 组-读
S_IWGRP 组-写
S_IXGRP 组-执行
S_IROTH 其他-读
S_IWOTH 其他-写
S_IXOTH 其他-执行
注意:
- 用文件名打开任一类型的文件时,对名字中包含的每一个目录要求具有执行权
- 目录读与执行的区别:读可以得到文件名列表,执行则允许对目录进行搜索找特定文件名,如果对一个目录有读无执行,则Shell在此目录下不会找到可执行文件
- 在一个目录中创建一个文件,要求对该目录具有写与执行权
- 可用 chmod 命令修改文件访问权限,如为test.bin文件添加所有的读写执行权限:
#chmod 777 /home/e5/test.bin
2 文件类型
- 普通文件
- 目录文件,对一个目录文件具有读许可权的任一进程都可以读该目录的内容,但只有内核可以写目录文件
- 字符特殊文件,这种文件用于系统中某些类型的设备;
- 块特殊文件,这种文件典型地用于磁盘设备;
- FIFO,这种文件用于进程间的通信,有时也将其称为命名管道;
- 套接口(socket),这种文件用于进程间的网络通信;
- 符号连接(symbolic link),这种文件指向另一个文件,符号链接分为软连接和硬链接;
3 access 函数
int access (const char *pathname, int mode);
功能:进行许可权测试。其中参数 mode 是下列常数的逐位或运算。
mode | 说明 |
---|---|
R_OK | 测试读许可权 |
W_OK | 测试写许可权 |
X_OK | 测试执行许可权 |
F_OK | 测试文件是否存在 |
4 chmod、fchmod 函数
int chmod(const char *pathname, mode_t mode);
int fchmod(int filedes, mode_t mode);
功能:更改文件的存取许可权。
chmod 在指定的文件上操作,fchmod 对已经打开的文件进行操作,常数 mode 为存取许可权位的或运算。
注意:为了改变一个文件的许可权位,进程的有效用户ID必须等于文件的所有者,或者该进程具有超级用户许可权。
chmod 举例:改变文件的存取许可权
# include <sys/tpyes.h>
# include <sys/stat.h>
# include”ourhdr.h”
int main (void){
struct stat statbuf;
if (stat(“foo” , &statbuf) < 0) // 将文件 foo 的有关信息填写到 statbuf 中
err_sys(“stat error for foo”);
if (chmod (“foo”, S_IXGRP | S_ISGID < 0) // 更改组执行和 设置组 ID
err_sys(“chmod error for foo”);
if (chmod (“bar”,S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH< 0) // 更改用户读写,组读,其他执行
err_sys(“chmod error for bar”);
exit(0);
}
5 chown、fchown、lchown 函数
int chown(const char *pathname,uid_t owner, gid_t group);
int fchown(int filedes, uid_t owner, gid_t group);
int lchown(const char *pathname,uid_t owner, gid_t group);
功能:用于更改文件的用户ID和组ID。
注意:在符号连接情况下, lchown 更改符号连接本身的所有者,而不是该符号连接所指向的文件
6 link、unlink 函数
int link(const char*existing, const char *newpath);
Int unlink(const char*pathname);
功能: link 创建一个新目录项。
unlink 删除一个目录项。将 pathname 引用的文件连接计数减1。
注意:只有超级用户进程可以创建指向一个目录的新连接,使用 unlink 只有当连接计数达到0时,该文件的内容才可被删除。另一个条件也阻止删除文件的内容——只要有进程打开了该文件,其内容也不能删除。
7 符号连接
符号连接是对一个文件的间接指针,而 link 和 unlink 创建的是硬连接,二者的区别是:硬连接直接指向文件,而符号连接是对文件的间接引用。
硬连接的要求:( a )连接和文件位于同一文件系统中;( b )只有超级用户才能创建到目录的硬连接。
引进符号连接的原因是为了避免硬连接的这些限制。
举例:假设创建硬连接f2到文件f1,符号连接连接f3到文件f1;若删除硬连接f2,对f1和f3无影响,删除 f3,对 f1 和 f2 也无影响,如果删除f1,对f2无影响,但是符号连接将显示错误。
原因:一个文件可以有多个文件名,此处f1和f2指向同一个文件的i节点,删除一个,可以使用另一个对文件进行访问,但是符号连接f3属于一种特殊的文本文件,记录的是文件f1的位置,所以当删除f1的时候,f3会出现错误。
8 symlink、readlink 函数
int symlink(const char*actualpath, const char* sympath);
功能:该函数创建一个新目录项 sympath。由于此处创建的是符号连接,所以 actualpath 和 sympath 并不需要位于同一文件系统中。
当我们采用 open 函数打开一个文件时,如果文件路径存在符号连接(由于 open 函数跟随符号连接,也就是说执行符号连接指向的内容),所以就要求有一种方法打开该连接本身,readlink 函数提供了这种功能:
int readlink(const char*actualpath, char* buf,int bufsize);
功能:打开连接本身。如果此函数成功,则它返回读入 buf 的字节数。在 buf
中返回的符号连接的内容不以 null
字符终止。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论