Unix/Linux编程-文件和目录(二)

文件和目录(二)

4.8 更改文件实际用户ID和实际组ID

#include <unistd.h>

int  chown(const char *pathname, uid_t owner, gid_t group);

int  fchown(int fd, uid_t owner, gid_t group);

int  fchownat(int fd, const char *pathname, uid_t owner, gid_t group, int flag);

int lchown(const *pathname, uid_t owner, gid_t group);

返回值:成功返回0,出错返回-1


(1) owner或group中的任意一个是-1,则对应的ID不变。
(2) 在富豪链接情况下,lchown和fchownat(设置了AT_SYMLINK_NOFOLLOW标志)更改符号链接本身的所有者,而不是该符号链接所指向的文件的所有者。
(3) 基于BSD的系统一直规定只有超级用户才能更改一个文件的所有者。System V则允许仁义用户更改他们所拥有的文件的所有者。

4.9 文件截断

#include <unistd.h>

int  truncate(const char *pathname, off_t length);

int  ftruncate(int fd, off_t length);

这两个函数将一个现有文件长度截断为length。如果该文件以前的长度大于length,则超过length意外的数据不能再访问。如果以前的长度小于length,文件长度增加,在以前的文件尾端和新的文件尾端之间的数据读作0。

4.10 创建一个现有文件的链接

任何一个文件可以有多个目录项指向其i节点。创建一个指向现有文件的链接的方法是使用link函数或linkat函数。

#include <unistd.h>

int link(const char *existingpath,const char *newpath;

int linkat(int efd,const char *existingpath, int nfd, const char *newpath, int flag);

返回值:成功返回0,出错返回-1


如果newpath已经存在,则返回出错。只创建newpath的最后一个分量,路径中的其他部分应当已经存在。
当现有文件是符号链接时,有flag参数来控制linkat函数是创建指向现有符号链接的链接还是创建指向现有符号链接所指向的文件的链接。flag参数设置了AT_SYMLINK_NOFOLLOW标志,就创建指向符号链接目标的链接。

4.11 删除现有的目录项

#include <unistd.h>

int unlink(const char *pathname);

int unlinkat(int fd, const char *pathname, int flag);

返回值:成功返回0,出错返回-1

删除目录项,并将由pathname所引用文件的链接计数减1.
flag参数给出了一种方法,使调用进程可以改变unlinkat函数的额默认行为,当AT_REMOVEDIR标志被设置时,unlinkat函数可以类似于rmdir一样删除目录。

4.12 创建和读取符号链接

符号链接是对一个文件的简介指针,而硬链接直接指向文件的i节点,引入符号链接是为了避开硬链接的一些限制。硬链接通常要求链接和文件位于同一文件系统中;只有超级用户才能创建指向目录的硬链接。

#include <unistd.h>

int symlink(const char *actualpath, const char *sympathy);

int symlinkat(const char *actualpath, const char *sympathy);

返回值:成功返回0,错误返回-1

函数创建了一个指向actualpath的新目录项sympath。在创建此符号链接是,并不要求actualpath已经存在。


因为open函数跟随符号链接,所以需要有一种方法打开该链接本身,并读该连接中的名字。

#include <unistd.h>

ssize_t readlink(const char *pathname, char *buf, size_t bufsize);

ssize_t readlinkat(int fd, const char *pathname, char *buf, size_t bufsize);

返回值:成功返回读取的字节数,出错返回-1

4.13 读目录函数

#include <dirent.h>

DIR *opendir(const char *pathname);

DIR *fdopendir(int fd);

返回值:成功返回目录指针,出错返回NULL

struct  dirent *readdir(DIR *dp);

返回值:成功返回dirent结构指针,若在目录尾或出错,返回NULL

void  rewinddir(DIR *dp);

int closedir(DIR *dp);

返回值:成功返回0,出错返回-1

long  telldir(DIR *dp);

返回值:与dp关联的目录中的当前位置

void seekdir(DIR *dp,long loc);

DIR结构是一个内部结构,上述函数用这个内部结构保存当前正在被读的目录的有关信息。
有opendir和fdopendir返回的指向DIR。opendir执行初始化操作,使第一个readdir返回目录中的第一个目录项。DIR结构有fdopendir创建时,readdir返回的第一项取决于传给fdopendir函数的文件描述符相关的文件偏移量。

4.14 mkdir、mkdirat、rmdir函数

4.14.1 创建空目录

#include <sys/stat.h>

int mkdir(const char *pathname, mode_t mode);

int mkdirat(int fd, const char *pathname, mode_t mode);

返回值:成功返回0,出错返回-1

创建一个新的空目录,其中. 和 .. 目录项是自动创建的。所指定的文件访问权限mode还会经过进程的文件模式创建屏蔽字修改(umask)。
对于目录通常至少要设置一个执行权限位,以允许访问该目录中的文件名。

4.14.2 删除空目录

#include <unistd.h>

int rmdir(const char *pathname);

返回值:成功返回0,失败返回-1

如果调用此函数使得目录的链接计数为0,并且也没有其他进程打开此目录,则释放此目录。
如果链接计数达到0时,有一个 或多个进程打开此目录,则在此函数返回前删除最后一个链接. 和 ..项。而且在此目录中不能再创建新文件,但是在最后一个进程关闭它之前并不释放此目录。

4.15 文件权限位总结

mode常量

说明

对普通文件的影响

对目录文件的影响

S_ISUID

设置用户ID

执行时设置有效用户ID

S_ISGID

设置组ID

若组执行位设置,则执行时设置有效组ID;否则使强制性起作用

将目录中创建的新文件的组ID设置为目录的组ID

S_ISVTX

粘着位

在交换区缓冲程序正文

限制在目录中删除和重命名文件

S_IRWXU

用户读写执行

许可用户读写执行文件

许可用户读目录项,删除和创建目录,搜索给定路径名

S_IRUSR

用户读

许可用户读文件

许可用户读目录项

S_IWUSR

用户写

许可用户写文件

许可用户在目录中删除和创建文件

S_IXUSR

用户执行

许可用户执行文件

许可用户在目录中搜索给定路径名

S_IRWXG

组读写执行

许可组读写执行文件

许可组读目录项,删除和创建目录,搜索给定路径名

S_IRGRP

组读

许可组读文件

许可组读目录项

S_IWGRP

组写

许可组写文件

许可组在目录中删除和创建文件

S_IXGRP

组执行

许可组执行文件

许可组在目录中搜索给定路径名

S_IRWXO

其他读写执行

许可其读写执行文件

许可其他读目录项,删除和创建目录,搜索给定路径名

S_IROTH

其他读

许可其他读文件

许可其他读目录项

S_IWOTH

其他鞋

许可其他写文件

许可其他在目录了中删除和创建文件

S_IXOTH

其他执行

许可其他执行文件

许可其他在目录中搜索给定路径名


猜你喜欢

转载自blog.csdn.net/water_3700348/article/details/78259891