十三、函数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[]);
int utimensat(int fd, const char *path, const struct timespec times[], 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[];
size_t size; if(chdir("/usr/local/lib") < )
{
err_sys("chdir error");
} if(getcwd(ptr, ) == NULL)
{
err_sys("getcwd error");
} printf("cwd = %s\n", ptr); exit();
}

4-23-24 chdir和getcwd实例

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

  1. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  2. [04]APUE:文件与目录

    [a] stat / lstat / fstat #include <sys/stat.h> int stat(const char *restrict pathname, struct ...

  3. (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  4. apue chapter 4 文件和目录

    1.文件信息结构体 struct stat{ mode_t st_mode; //file type and permissions ino_t st_ino; //i-node number (se ...

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

    七.函数umask umask函数为进程设置文件模式创建屏蔽字,并返回之前的值,这是少数几个没有出错返回函数中的一个.其中cmask是9个常量(S_IR/W/XUSR.S_IR/W/XGRP.S_IR ...

  6. apue学习笔记(第四章 文件和目录)

    本章将描述文件系统的其他特性和文件的性质. 函数stat.fstat.fstatat和lstat #include <sys/stat.h> int stat(const char *re ...

  7. [APUE]文件和目录(中)

    一.link.unlink.remove和rename 一个文件可以有多个目录项指向其i节点.使用link函数可以创建一个指向现存文件连接 #include <unistd.h> int ...

  8. [APUE]文件和目录(上)

    一.文件权限 1. 各种ID 我在读这一章时遇到了各种ID,根据名字完全不清楚什么意思,幸好看到了这篇文章,http://blog.csdn.net/ccjjnn19890720/article/de ...

  9. Notes for Apue —— chapter 4 Files and Directories(文件和目录)

    4.1 Introduction 4.2 stat, fstat, fstatat, and lstat Functions The lstat function is similar to stat ...

随机推荐

  1. Centos 6.5 下安装 Zabbix server 3.0服务器的安装及 监控主机的加入(2)

    一.Centos 6.5 下的Zabbix Server安装 上篇文章记录的是centos 7 下安装zabbix ,很简单.但是6.5上面没有可用的源直接安装zabbix,所以需要从别处下载.感谢i ...

  2. sql语句中避免使用mysql函数,提升mysql处理能力。

    如下sql中不要用mysql内置函数now()等,这样第一可以提高sql执行效率,第二统一程序层处理sql中时间参数,避免因服务器时间差导致问题产生. 使用PDO预处理,第一可以提高sql效率,第二可 ...

  3. 指向“**js/shop.js”的 <script> 加载失败

    指向“”的 <script> 加载失败 找了半天没找到原因 原来是meta里面的 csp Content-Security-Policy <meta http-equiv=" ...

  4. LeetCode之字符串处理题java

    344. Reverse String Write a function that takes a string as input and returns the string reversed. E ...

  5. python 中的type

    1. type(object) -> the object's type 返回的是object的类型,即对象的类定义 例如:用元类动态生成子类metaclass = type(father)   ...

  6. bootstrap-select用法详解

    首先需要引入 <!-- Latest compiled and minified CSS --> <link rel="stylesheet" href=&quo ...

  7. java基础强化——深入理解反射

    目录 1.从Spring容器的核心谈起 2. 反射技术初探 2.1 什么是反射技术 2.2 类结构信息和java对象的映射 3 Class对象的获取及需要注意的地方 4. 运行时反射获取类的结构信息 ...

  8. VM 监控信息布局

    <div ng-show="showVmChart"> <div class="row"> <div class="co ...

  9. Oracle VM VirtualBox 部署CS devcloud2 开发环境

    Setting up (VirtualBox) 1. Get the new DevCloud 2.0 virtual appliance. The new image was created usi ...

  10. redis 面试题1 有用

    1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库 ...