1 stat,fstat,lstat函数
#include<sys/stat.h> int stat (const char* restrict pathname, struct stat *restrict buf); int fstat (int filedes, struct stat * buf); int lstat (const char* restrict pathname, struct stat *restrict buf);
成功返回0,失败返回-1
stat返回pathname上指定的文件的信息结构,fstat返回文件描述符指定文件的信息结构,lstat返回符号连接文件的信息结构,而不是符号连接指向的文件的信息结构
2 lstat练习
#include<stdio.h> #include<sys/stat.h> int main(int argc, char* argv[]) { char* ptr; int i; struct stat buf; for(i=1;i<argc;i++) { printf("%s:",argv[i]); if(( lstat(argv[i], &buf))<0) { printf("error:lstat"); continue; } if(S_ISREG(buf.st_mode)) ptr = "regular"; else if(S_ISDIR(buf.st_mode)) ptr = "directory"; else if (S_ISCHR(buf.st_mode)) ptr = "character special"; else if(S_ISBLK(buf.st_mode)) ptr = "block special"; else if(S_ISFIFO(buf.st_mode)) ptr = "fifo"; else if(S_ISLNK(buf.st_mode)) ptr = "link"; else if(S_ISSOCK(buf.st_mode)) ptr = "socket"; printf("%s\n",ptr); } return 0; }
3 所有者和组所有者
文件的所有者由st_uid标识,组所有者由st_gid标识
4 创建一个文件的用户id会被设置为进程的有效用户id,组id可能是进程的有效组id,也可能是文件所在目录的有效组id
5 access函数用于测试实际用户id对一个文件的访问
#include<unistd.h> int access (const char* pathname ,int mode);
成功返回0,失败返回-1
mode的取值
R_OK, W_OK, X_OK, F_OK(测试文件是否存在)
6 chmod和fchmod函数,改变文件访问权限
#include<sys/stat.h> int chmod(const char* pathname, mode_t mode); int fchmode(int filedes, mode_t mode)
成功返回0,失败返回-1
实例:
chmode("bar", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
为bar增加用户的读写权限,和组及其他的读权限
7 粘住位
当这一位被设置了,该程序第一次被执行并结束时,程序正文部分仍然保存在交换区,使得下次执行程序能较快装入内存区,因为交换区占据连续磁盘空间,而一般的数据往往随机存放
S_ISVTX = SaVed TeXt
8 chown, fchown, lchown, 改变文件用户ID和组ID
#include<unistd.h> 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)
时间: 2024-08-01 12:50:08