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 其他-执行
注意:
#chmod 777 /home/e5/test.bin
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);
}
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 更改符号连接本身的所有者,而不是该符号连接所指向的文件
int link(const char*existing, const char *newpath);
Int unlink(const char*pathname);
功能: link 创建一个新目录项。
unlink 删除一个目录项。将 pathname 引用的文件连接计数减1。
注意:只有超级用户进程可以创建指向一个目录的新连接,使用 unlink 只有当连接计数达到0时,该文件的内容才可被删除。另一个条件也阻止删除文件的内容——只要有进程打开了该文件,其内容也不能删除。
符号连接是对一个文件的间接指针,而 link 和 unlink 创建的是硬连接,二者的区别是:硬连接直接指向文件,而符号连接是对文件的间接引用。
硬连接的要求:( a )连接和文件位于同一文件系统中;( b )只有超级用户才能创建到目录的硬连接。
引进符号连接的原因是为了避免硬连接的这些限制。
举例:假设创建硬连接f2到文件f1,符号连接连接f3到文件f1;若删除硬连接f2,对f1和f3无影响,删除 f3,对 f1 和 f2 也无影响,如果删除f1,对f2无影响,但是符号连接将显示错误。
原因:一个文件可以有多个文件名,此处f1和f2指向同一个文件的i节点,删除一个,可以使用另一个对文件进行访问,但是符号连接f3属于一种特殊的文本文件,记录的是文件f1的位置,所以当删除f1的时候,f3会出现错误。
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 字符终止。

