Linux 文件属性设置

发布于 2023-01-15 17:30:08 字数 4152 浏览 187 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

世俗缘

暂无简介

文章
评论
27 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文