APUE:文件和目录(二)

本文详细介绍了在Unix系统中进行文件和目录操作的各种函数,包括link、unlink、remove、rename、mkdir、rmdir等,以及如何使用这些函数进行文件的链接、删除、重命名和目录的创建与删除。同时,还讲解了文件的时间属性修改、符号链接的创建和读取、以及文件系统的同步操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件和目录(二)

link,unlink,remove和rename函数

#include <unistd.h>
int link(const char *existingpath, const char * newpath) ;
返回:若成功则为0,若出错则为-1
  • 此函数创建一个新目录项newpath,它引用现存文件existingpath。如若newpath已经存在,则返回出错。
  • 这是一个原子操作。
  • 只有超级用户进程可以创建指向一个目录的新连接。

为了删除一个现存的目录项,可以调用unlink函数。

#include <unistd.h>
int unlink(const char *pathname) ;
返回:若成功则为0,若出错则为-1
  • 此函数删除目录项,并将由pathname所引用的文件的连接计数减1。如果该文件还有其他连接,则仍可通过其他连接存取该文件的数据。如果出错,则不对该文件作任何更改。
  • 只有当连接计数达到 0时,该文件的内容才可被删除。另一个条件也阻止删除文件的内容——只要有进程打开了该文件,其内容也不能删除。关闭一个文件时,内核首先检查使该文件打开的进程计数。如果该计数达到0,然后内核检查其连接计数,如果这也是 0,那么就删除该文件的内容。

因此可以使用unlink来创建临时文件,先open再unlink,那么在进程结束时,临时文件就会自动删除,即使程序崩溃临时文件也不会残留下来。

  • 如果pathname时一个符号连接,那么unlink涉及的是符号连接而不是由该连接所引用的文件。
#include <stdio.h>
int remove(const char *pathname);
返回:若成功则为0,若出错则为-1

remove函数解除对一个文件或目录的连接。对于文件, remove的功能与unlink相同。对于目录,remove的功能与rmdir相同。

文件或目录用rename更名

#include <stdio.h>
int rename(const char *oldname, const char *newname) ;
返回:若成功则为0,若出错则为-1

符号连接

  • 符号连接是对一个文件的间接指针。
  • 调用函数时需注意该函数时对符号连接调用还是对指向的文件调用。

symlink和readlink函数

symlink函数创建一个符号连接。

#include <unistd.h>
int symlink(const char *actualpath, const char *sympath) ;
返回:若成功则为0,若出错则为-1

该函数创建了一个指向actualpath的新目录项sympath。

    #include <unistd.h>
    int readlink(const char *pathname, char *buf, int bufsize) ;
    返回:若成功则为读的字节数,若出错则为- 1

因为open不能直接打开符号连接,所以该函数打开连接本身,并读取名字,此函数组合了open read close的所以操作。

文件的时间

在这里插入图片描述
i节点状态的最后更改时间是指存取许可位,连接数,用户ID的修改。

utime函数

一个文件的存取和修改时间可以用utime函数更改。

#include <sys/types.h>
#include <utime.h>
int utime(const char *pathname, const struct utimbuf * times) ;
返回:若成功则为0,若出错则为-1

utimbuf结构体结构如下

struct utimbuf {
time_t actime; /*access time*/
time_t modtime; /*modification time*/
}

该函数的操作取决于times是否为NULL

  • 如果times为NULL,则将存取时间和修改时间设置为当前时间。此操作需满足两个条件之一:(a)进程的有效用户ID必须等于该文件的所有者ID,(b)进程对该文件必须具有写许可权。
  • 如果times不为NULL,则将存取时间和修改时间设置为times。
  • 我们不能更改i节点状态时间的值。

mkdir和rmdir函数

#include <sys/types.h>
#include <sys/stat.h>
int mkdir(const char *pathname, mode_t mode);
返回:若成功则为0,若出错则为-1

创建一个新的目录。

#include <unistd.h>
int rmdir(const char *pathname);
返回:若成功则为0,若出错则为- 1

删除一个空目录。

读目录

#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *pathname) ;
返回:若成功则为指针,若出错则为NULL
struct dirent *readdir(DIR *dp) ;
返回:若成功则为指针,若在目录尾或出错则为NULL
void rewinddir(DIR *dp) ;
int closedir(DIR *dp) ;
返回:若成功则为0,若出错则为-1

DIR类似于FILE结构,由opendir返回的指向DIR结构的指针由另外三个函数使用。opendir执行初始化操作,使第一个readdir读目录中的第一个目录项。目录中各目录项的顺序与实现有关。它们通常并不按字母顺序排列。

chdir, fchdir 和getcwd函数

#include <unistd.h>
int chdir(const char *pathname) ;
int fchdir(int filedes) ;
两个函数的返回:若成功则为 0,若出错则为-1

可以分别用pathname或打开文件描述符来指定新的当前工作目录。

该函数只影响该进程的当前工作目录,不影响其他进程。

#include<unistd.h>
char *getcwd(char *buf, size_t size);
返回:若成功则为buf, 若出错则为NULL

该函数将绝对路径存到buf中,size需足够大来保存绝对路径。

特殊设备文件

看不懂,将来再补

sync和fsync函数

#include <unistd.h>
void sync(void);
int fsync(int filedes) ;
返回:若成功则为0,若出错则为-1

sync只是将所有修改过的块的缓存排入写队列,然后就返回,它并不等待实际I/O操作结束。
fsync将指定文件描述符,等待I/O结束再返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值