UNIX C 文件权限 Part2_day01

1.文件访问测试

  测试调用进程对指定文件是否拥有足够的访问权限

#include <unistd.h>

int access(const char* pathname,int mode);
        成功返回0,失败返回 -1
    
    -pathname:文件路径
    -mode:访问权限,可取以下值
        R_OK - 可读否
       W_OK - 可写否
        X_OK - 可执行否
        F_OK  - 存在否

2.权限掩码: 

   设置调用进程的权限掩码: 

#include <sys/stat.h>

mode_t umask(mode_t cmask);
    函数永远成功,返回原来的权限掩码

    - cmask :新权限掩码
                    默认掩码(0022);

3.修改文件权限

    修改指定文件的权限:

#include <sys/stat.h>

int chmod(const char* path,mode_t mode);
int  fchmod(int fd,mode_t mode);
        成功返回0,失败返回-1

-path :文件路径
-mode:文件权限
-fd:文件描述符

4.修改文件大小

  指定文件的大小:

    

#include <unistd.h>

int truncate(const char* path,off_t length);
int ftruncate(int fd,off_t length);
        成功返回0,失败返回-1

-path:文件路径
-length:文件大小
-fd:文件描述符

5.内存映射文件

  建立虚拟内存到物理内存或文件的映射

  

#include <sys/mman.h>

void* mmap(void* start,size_t length,int prot,
        int  flags,int fd,off_t offset);
    成功返回映射区内存起始地址,失败返回MAP_FAILED(-1)

-start:映射区内存起始地址,NULL系统自动选定后返回
-length:映射区字节长度,自动按页(4K)园整
-prot:映射区访问权限,可以取以下值
        PROT_READ  - 映射区可读
        PROT_WRITE -映射区可写
        PROT_EXEC  -映射区可执行
        PROT_NONE  -映射区不可访问
-flags:映射标志,可取下值
    MAP_ANONYMOUS - 匿名映射,将虚拟内存映射到物理内存而非文件,忽略fd和offset参数
    MAP_PRIVATE -对映射区的写操作只反映到缓冲区中,并不会真正写入文件
    MAP_SHARED -对映射区的写操作直接反映到文件中
    MAP_DENYWRITE -拒绝其他对文件的写操作
    MAP_FIXED -若在start上无法创建映射,则失败(无此标志系统会自动调整)
    MAP_LOCKED -锁定映射区,保证其不被换出
-offset:文件偏移量

6.解除虚拟内存到物理内存或文件的映射

#include <sys/mman.h>

int munmap(void* start,size_t length);
    成功返回0,失败-1

-start: 映射区内存起始地址,必须是页的首地址
-length:映射区字节长度,自动按页(4K)园整

7.文件硬链接

   创建一个已有硬链接创建一个新的硬链接

#include <unistd.h>

int link(const char* oldpath,const char* newpath);
-oldpath:原始路径
-newpath:新建路径

   删除目录文件里的一个硬链接条目

#include <unistd.h>

int unlink(const char* pathname);
int remove(const char* pathname); 成功返回0,失败
-1

   修改文件的名字:

#include <stdio.h>

int rename(const char* oldpath,const char* newpath);
成功返回0,失败-1

8.符号链接

  

#include <unistd.h>

int symlink(const char* oldpath,const char* newpath);
    成功 0,失败-1

ssize_t readlink(const char* path,char* buf,size_t size);

    成功返回拷入buf的符号链接文件的内容的字节数,失败返回-1

9.目录的创建

  创建空目录

#include <sys/stat.h>

int mkdir(const char* pathname,mode_t mode);
    成功返回0,失败-1
--pathname:目录路径
--mode:访问权限,目录的执行权限(x)表示可进入

  删除一个空目录

#include <unistd.h>

int rmdir(const char* pathname);
成功0,失败-1

-pathname:目录路径

10.当前工作目录

  获取当前工作目录  

#include <unistd.h>

char* getcwd(char* buf,size_t size);

成功返回当前工作目录路径字符串指针,失败返回NULL

-buf:缓冲区
-size:缓冲区大小(字节)

  切换当前工作目录

#include <unistd.h>

int chdir(const char* pathname);
int fchdir(int fd);

-path:工作目录路径
-fd:目录工作目录文件描述符(由open函数返回)

11.获取目录内容

  打开目录

#include <dirent.h>

DIR* opendir(const char* name);
DIR* fdopedir(int fd);
    成功返回目录流指针,失败返回NULL
-name:目录路径
-fd:目录文件描述符(由open函数返回)

  关闭目录

#include <dirent.h>

int closedir(DIR* dirp);
    成功返回0,失败-1
-dirp:目录流指针

  读取目录

#include <dirent.h>

struct dirent* readdir(DIR* dirp);
成功返回目录条目指针,读完(不置errno)或失败返回NULL

目录条目结构:

struct dirent{
    ino_t   d_ino; //i节点号
    off_t    d_off;//下一条目位置
    unsingned short   d_reclen;//记录长度
    unsingned  char  d_type;//文件类型
    char     d_name[256];//文件名
};

--每个目录中还有两个特殊的条目,其d_name成员的值为“.”,“..”,分别表示该目录本身和其父目录,更目录无父目录

其中表示文件类型的d_type成员,可取以下值
DT_REG    -普通文件
DT_DIR    -目录
DT_SOCK   -本地套节字
DT_CHR    -字符设备
DT_BLK    -块设备
DT_LNK    符号链接
DT_FIFO   有名管道
DT_UNKNOWN    未知
原文地址:https://www.cnblogs.com/Kernel001/p/7802080.html