APUE(4)---文件和目录 (3)

十三、函数rename和renameat

#include <stdio.h>
int rename(const char *oldname, const char *newname);
int renameat(int oldfd, const char *oldname, int newfd, const char *newname);

  文件或目录可以用rename函数或者renameat函数进行重命名。有几种情况需要说明:

1、如果oldname指的是一个文件而不是目录,那么为该文件或符号链接重命名。在这种情况下,如果newname已存在,它不能引用一个目录。如果newname已存在,而且不是一个目录,则将该目录项删除然后将oldname重命名为newname。对包含oldname的目录以及包含newname的目录,调用进程必须具有写权限。

2、如果oldname指的是一个目录,那么为该目录重命名。如果newname已存在,则它必须引用一个目录,而且该目录应当是一个空目录。

3、如果oldname或newname引用符号链接,则处理符号链接本身,而不是它所引用的文件。

4、不能对.和..重命名。

十四、符号链接及其创建和读取

  符号连接是对一个文件的间接指针,它与硬链接有所不同,硬链接直接指向文件的i节点。引入符号链接的原因是为了避开硬链接的一些限制:1、硬链接通常要求连接和文件位于同一文件系统中;2、只有超级用户才能创建只想目录的硬链接。当使用以名字引用文件的函数时,应当了解该函数是否处理符号链接,也就是该函数是否跟随符号连接到达它所链接的文件。如若该函数具有处理符号连接的功能,则其路径名参数引用由符号连接指向的文件。否则,一个路径名参数引用链接本身,而不是由该连接指向的文件。

#include <unistd.h>
int symlink(const char *actualpath, const char *sympath);
int symlinkat(const char *actualpath, int fd, const char * sympath);

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

  创建符号连接时,并不要求actualpath已存在,并且,actualpath和sympath并不需要位于同一文件系统中。

十五、文件的时间及其修改

  unix为每个文件维护了三个时间字段:

  st_atim   :文件数据的最后访问时间    read        -u

  st_mtim  :文件数据的最后修改时间    write        默认

  st_ctim   :i节点状态的最后更改时间    chmod、chown   -c

  因为i节点中的所有信息和文件的实际内容是分开存放的。修改时间是文件内容最后一次被修改的时间。状态时间是该文件的i节点一次被修改的时间,我们说明了很多影响到i节点的操作,如更改文件的访问权限、更改用户ID,更改链接数,但是他们并没有修改文件的实际内容。系统并不维护对一个i节点最后一次访问的时间,所以access和stat函数并不更改这3个时间中的任意一个。

  一个文件的访问和修改时间可以用以下几个函数更改:

#include <sys/stat.h>
int futimens(int fd, const struct timespec times[2]);
int utimensat(int fd, const char *path, const struct timespec times[2], int flag);

十六、函数mkdir、mkdirat和rmdir

#include <sys/stat.h>
int mkdir(const char *pathnaem, mode_t mode);
int mkdirat(int fd, const char *pathname, mode_t mode);

#include <unistd.h>
int rmdir(const char *pathname);

  创建空目录会自己创建.和..;常见的错误是制定与文件相同的mode(只指定读、写),但是对于目录通常至少要设置一个执行权限位,以允许访问该目录中的文件名。

十七、读目录

  对某个目录具有访问权限的任一用户都可以读该目录,但是为了防止文件系统产生混乱,只有内核才能写目录。其相关的主要函数:

#include <dirent.h>
DIR *opendir(const char *pathname);
DIR *fdopendir(int fd);

struct dirent * readdir(DIR *dp);

void rewinddir( DIR *dp);

int closedir(DIR *dp);

long telldir(DIR *dp);

void seekdir(DIR *dp, long loc);

  待补充....

十八、函数chdir、fchdir和getcwd

  每个进程都有一个当前工作目录,此目录是搜索所有相对路径名的起点,进程可以调用chdir和fchdir来更改当前目录,需要注意的是当前工作目录是进程的一个属性,所以它只影响调用chdir的金城本身,而不影响其他进程。

#include <unistd.h>
int chdir(const char *pathname);
int fchdir(int fd);

char * getcwd(char *buf, size_t size);
#include "apue.h"

int main(void)
{
    char ptr[1024];
    size_t size;

    if(chdir("/usr/local/lib") < 0)
    {
        err_sys("chdir error");
    }

    if(getcwd(ptr, 1024) == NULL)
    {
        err_sys("getcwd error");
    }

    printf("cwd = %s\n", ptr);

    exit(0);
}

4-23-24 chdir和getcwd实例

时间: 2024-10-05 00:01:25

APUE(4)---文件和目录 (3)的相关文章

(三) 一起学 APUE 之 文件和目录

. . . . . 前面两篇博文讲了文件 IO 的基本操作,但是它们操作的都是文件本身所存储的有效数据.而文件系统保存文件的时候不仅仅要存储文件内的数据,还要存储许多亚数据,即文件属性和其它特征数据.这篇博文 LZ 就带领大家讨论文件系统亚数据的操作. 1.stat(2) 1 stat, fstat, lstat - get file status 2 3 #include <sys/types.h> 4 #include <sys/stat.h> 5 #include <u

APUE:文件和目录

文件权限有: S_IRWXU = S_IRUSR | S_IWUSR | S_IXUSR S_IRWXG = S_IRGRP | S_IWGRP | S_IXGRP S_IRWXO = S_IROTH | S_IWOTH | S_IXOTH 文件类型有: S_ISREG() // 普通文件 S_ISDIR() // 目录 S_ISCHR() // 字符特殊文件(设备) S_ISBLK() // 块特殊文件(设备) S_ISFIFO() // 管道或 FIFO S_ISLNK() // 符号链接

apue第四章 文件和目录

函数stat,fstat,fstatat, lstat #include <sys/stat.h> int stat(const char *restrict pathname, struct stat *restrict buf); int fstat(int fd, struct stat *buf); int lstat(const char *restrict pathname, struct stat *restrict buf); int lstat(int fd, const c

APUE(4)---文件和目录 (2)

umask函数为进程设置文件模式创建屏蔽字,并返回之前的值,这是少数几个没有出错返回函数中的一个.其中cmask是9个常量(S_IR/W/XUSR.S_IR/W/XGRP.S_IR/W/XOTH)中的若干个按位“或”构成的. #include<sys/stat.h> mode_t umask(mode_t cmask); //返回值:之前的文件模式创建屏蔽字 #include<apue.h> #include<fcntl.h> #define RWRWRW (S_IRU

APUE读书笔记: 文件和目录

stat, fstat, fstatat 和 lstat函数: stat函数返回与pathname命名文件相关的信息结构: fstat函数返回已在文件描述符fd打开文件的相关信息: lstat函数与stat函数类似,但当命名文件是一个符号链接时,返回该符号链接的相关信息: fstatat函数为相对于当前打开目录(有fd参数指向)的路径名返回文件统计信息. struct stat 的具体定义如下图: 文件类型: 文件类型包括:普通文件,目录文件,块特殊文件,字符特殊文件,FIFO,套接字和符号链接

[APUE]文件和目录

一.APUE这一章中的各种晦涩名词 我在读这一章时遇到了各种ID,根据名字完全不清楚什么意思,幸好看到了这篇文章,http://blog.csdn.net/ccjjnn19890720/article/details/6990656,总结一下 每一个进程其实对应了6个以上的ID,它们分别是:实际用户ID.实际组ID(我们实际上是谁,执行这个程序的用户和组),有效用户ID.有效组ID.附加组ID(用于文件访问权限检查),保存设置用户ID,保存设置组ID(由exec函数保存) 实际用户ID/实际组I

APUE学习笔记:第四章 文件和目录

4.1 引言 本章将描述文件的特征和文件的性质 4.2 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); 三个函数的返

APUE: 文件和目录相关的系统调用

Tips:下面的总结是参考APUE(unix环境高级编程)这本书,在linux(ubuntu)上的实现. Linux系统的调用结构: 最上层:应用程序+shell命令(外部命令在coreutils中实现,内部命令在bash中实现) 中间层:linux下的库函数(gnu的c标准库在glibc中实现) 最底层:linux内核(163个linux系统调用接口+内核子系统(驱动)) 系统调用是linux内核和外部的唯一接口. unix的标准主要有两个: posix标准:可移植操作系统接口,IEEE.IS

APUE读书笔记-第四章 文件和目录

到第四章了,不知什么时候才能把这本书看完,耽误的时间太多了. 第四章是在第三章的基础上,主要描述文件系统的其他性质和文件的性质. 4.2 stat.fstat.fstatat.lstat函数 首先来看看这四个函数的原型: #include <sys/stat.h> ///usr/include/x86_64-linux-gnu/sys/ int stat (const char *__restrict __file, struct stat *__restrict __buf) int fst