一、link、linkat、unlink、unlinkat、remove函数

创建一个指向现有文件的链接的方法是使用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);

这两个函数创建一个新目录项newpath,它引用现有文件existingpath。如果newpath已经存在,则返回错误。

只创建newpath中的最后一个分量,路径中的其它部分应当已经存在。

对于linkat函数,现有文件是通过efd和existingpath参数指定的。默认情况下,如果两个路径名中的任意一

个是相对路径,那么它需要通过相对于对应的文件描述符进行计算。如果两个文件描述符中的任一个设置为AT_F

DCWD,那么相应的路径名(如果它是相对路径)就通过相对于当前目录进行计算。如果任一路径名是绝对路径,

相应的文件描述符参数就会被忽略。当现有文件是符号链接时,由flag参数来控制linkat函数是创建指向现有符

号链接的链接还是创建指向现有符号链接所指向的文件的链接。如果在flag参数中设置了AT_SYMLINK_FOLLOW标志

,就是创建指向符号链接目标的链接。如果这个标志被清除了,则创建一个指向符号链接本身的链接。

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

#include <unistd.h>
int unlink(const char *pathname);
int unlinkat(int fd,const char *pathname,int flag);

这两个函数删除目录项,并将由pathname所引用文件的链接计数减1。如果对该文件还有其它链接,则仍可以

通过其它链接访问该文件的数据。如果出错,则不对该文件做任何更改。

如果pathname参数是相对路径名,那么unlinkat函数计算相对于由fd文件描述符参数代表的目录的路径名。如

果fd参数设置为AT_FDCWD,那么通过相对于调用进程的当前工作目录来计算路径名。如果pathname参数是绝对路

径名,那么fd参数被忽略。flag参数给出了一种方法使调用进程可以改变unlinkat函数的默认行为。当AT_REMOVE

DIR标志被设置时,unlinkat函数可以类似于rmdir一样删除目录。如果这个标志被清除,unlinkat和unlink执行

同样的操作。

也可以用remove函数解除对一个文件或目录的链接。对于文件,remove的功能与unlink相同。对于目录,remo

ve的功能与rmdir相同。函数的原型为:

#include <stdio.h>
int remove(const char *pathname);

二、rename、renameat函数

文件或目录可以用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);

(1)如果oldname指的是一个文件而不是目录,那么为该文件或符号链接重命名。在这种情况下,如果newname已

存在,则它不能引用一个目录。如果newname已存在,而且不是一个目录,则现将该目录项删除然后将oldname重命名

为newname。对包含oldname的目录以及包含newname的目录,调用进程必须具有写权限,因为将更改这两个目录。

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

目录应当是空目录(空目录指的是该目录中只有.和..项)。如果newname存在(而且是一个空目录),则先将其删除

,然后将oldname重命名为newname。另外,当为一个目录重命名时,newname不能包含oldname作为其路径前缀。

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

(4)不能对.和..重命名。更确切的说,.和..都不能出现在oldname和newname的最后部分。

(5)如果oldname和newname引用同一文件,则函数不做任何更改而成功返回。如果newname已经存在,则调用进程

对它需要有写权限。另外,调用进程将删除oldname目录项,并可能要创建newname目录项,所以它需要对包含oldnam

e及包含newname的目录具有写和执行权限。

除了当oldname或newname指向相对路径名时,其它情况下renameat函数与rename函数功能相同。如果oldname参数

指定了相对路径,就相对于oldfd参数引用的目录来计算oldname。如果newname指定了相对路径,就相对于newfd引用

的目录来计算newname。oldfd或newfd参数都能设置为AT_FDCWD,此时相对于当前目录来计算相应的路径名。

三、symlink、symlinkat函数

可以用symlink或symlinkat函数创建一个符号链接。函数的原型为:

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

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

,actualpath和sympath并不需要位于同一文件系统中。

symlinkat函数与symlink函数类似,但sympath参数根据相对于打开文件描述符引用的目录(由fd参数指定)进行

计算。如果sympath参数指定的是绝对路径或者fd参数设置了AT_FDCWD值,那么symlinkat就等同于symlink函数。

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

提供了这种功能。函数的原型为:

#include <unistd.h>
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);

两个函数组合了open、read和close的所有操作。如果函数执行成功,则返回读入buf的字节数。在buf中返回的符号

链接的内容不以null字节终止。当pathname参数指定的是绝对路径名或者fd参数的值为AT_FDCWD,readlinkat函数的行

为与readlink相同。但是,如果fd参数是一个打开目录的有效文件描述符并且pathname参数是相对路径名,则readlink

at计算相对于由fd代表的打开目录的路径名。

四、futimens、utimensat、utimes函数

一个文件的访问和修改时间可以用以下几个函数更改。futimens和utimensat函数可以指定纳秒级精度的时间戳。用

到的数据结构是与stat函数族相同的timespec结构。函数的原型为:

#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);

这两个函数的times数组参数的第一个元素包含访问时间,第二个元素包含修改时间。时间戳可以按以下4种方式之

一进行指定:

(1)如果times参数是一个空指针,则访问时间和修改时间两者都设置为当前时间。

(2)如果times参数指定两个timespec结构的数组,任一数组元素的tv_nsec字段的值为UTIME_NOW,相应的时间戳就

设置为当前时间,忽略相应的tv_sec字段。

(3)如果times参数指向两个timespec结构的数组,任一数组元素的tv_nsec字段的值为UTIME_OMIT,相应的时间戳

保持不变,忽略相应的tv_sec字段。

(4)如果times参数指向两个timespec结构的数组,且tv_nsec字段的值为既不是UTIME_NOW也不是UTIME_OMIT,在这

种情况下,相应的时间戳设置为相应的tv_sec和tv_nsec字段的值。

执行这些函数所要求的优先权取决于times参数的值:

  • 如果times是一个空指针,或者任一tv_nsec字段设置为UTIME_NOW,则进程的有效用户ID必须等于该文件的所有者

ID;进程对该文件必须具有写权限,或者进程是一个超级用户进程。

  • 如果times是非空指针,并且任一tv_nsec字段的值既不是UTIME_NOW也不是UTIME_OMIT,则进程的有效用户ID必须

等于该文件的所有者ID,或者进程必须是一个超级用户进程。对文件只具有写权限是不够的。

  • 如果times是非空指针,并且两个tv_nsec字段的值都为UTIME_OMIT,就不执行任何的权限检查。

futimens函数需要打开文件来更改它的时间,utimensat函数提供了一种使用文件名更改文件时间的方法。pathname

参数是相对于fd参数进行计算的,fd要么是打开目录的文件描述符,要么设置为特数值AT_FDCWD(强制通过相对于调用

进程的当前目录计算pathname)。如果pathname指定了绝对路径,那么fd参数被忽略。

utimensat的flag参数可用于进一步修改默认行为。如果设置了AT_SYMLINK_NOFOLLOW标志,则符号链接本身的时间

就会被修改(如果路径名指向符号链接)。默认的行为是跟随符号链接,并把文件的时间改成符号链接的时间。

#include <sys/time.h>
int utimes(const char *pathname,const struct timeval times[]);

utimes函数对路径名进行操作。times参数是指向包含两个时间戳(访问时间和修改时间)元素的数组的指针,两个

时间戳是用秒和微妙表示的。

五、mkdir、mkdirat、rmdir函数

用mkdir和mkdirat函数创建目录,用rmdir函数删除目录。函数原型为:

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

这两个函数创建一个新的空目录。其中,.和..目录项是自动创建的。所指定的文件访问权限mode由进程的文件模式

创建屏蔽字修改。

mkdirat函数与mkdir函数类似。当fd参数具有特殊值AT_FDCWD或者pathname参数指定了绝对路径名时,mkdirat与mk

dir完全一样。否则,fd参数是一个打开目录,相对路径名根据此打开目录进行计算。

用rmdir函数可以删除一个空目录。空目录只包含.和..这两项的目录。函数的原型为:

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

如果调用此函数使目录的链接计数成为0,并且也没有其它进程打开此目录,则释放此前目录占用的空间。如果在链

接计数达到0时,有一个或多个进程打开此目录,则在此函数返回前删除最后一个链接及.和..项。在此目录中不能在创

建新文件。但是在最后一个进程关闭它之前并不释放此目录。

六、chdir、fchdir、getcwd函数

每个进程都有一个当前工作目录,此目录是搜索所有相对路径名的起点。进程调用chdir或fchdir函数可以更改当前

工作目录。函数的原型为:

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

在这两个函数中,分别用pathname或打开文件描述符来指定新的当前工作目录。

从当前工作目录(.)开始,用..找到其上一级目录,然后读其目录项,直到该目录项中的i节点编号与工作目录i节点

编号相同,这样就找到了其对应的文件名。按照这种方法,逐层上移,直到遇到根,这样就得到了当前工作目录完整的

绝对路径名。函数getcwd提供了这种功能,函数原型为:

#include <unistd.h>
char* getcwd(char *buf,size_t size);

必须向此函数传递两个参数,一个是缓冲区地址buf,另一个是缓冲区的长度size(以字节为单位)。该缓冲区必须

有足够的长度以容纳绝对路径名再加上一个终止null字节,否则返回出错。

Linux中文件函数(二)的更多相关文章

  1. Linux中文件函数(一)

    一.stat.fstat.fstatat.lstat函数 函数的原型为: #include <sys/stat.h> int stat(const char *restrict pathn ...

  2. linux中文件IO

    一. linux常用文件IO接口 1.1. 文件描述符 1.1.1. 文件描述符的本质是一个数字,这个数字本质上是进程表中文件描述符表的一个表项,进程通过文件描述符作为index去索引查表得到文件表指 ...

  3. [转]Linux中文件权限目录权限的意义及权限对文件目录的意义

    转自:http://www.jb51.net/article/77458.htm linux中目录与文件权限的意义 一.文件权限的意义 r:可以读这个文件的具体内容: w:可以编辑这个文件的内容,包括 ...

  4. Linux中open函数以及退出进程的函数

    open函数的flag详解1 读写权限:O_RDONLY O_WRONLY O_RDWR (1)linux中文件有读写权限,我们在open打开文件时也可以附带一定的权限说明 (譬如O_RDONLY就表 ...

  5. linux中probe函数传递参数的寻找(下)

    点击打开链接 linux中probe函数传递参数的寻找(下) 通过追寻driver的脚步,我们有了努力的方向:只有找到spi_bus_type的填充device即可,下面该从device去打通,当两个 ...

  6. open()函数 linux中open函数使用

    来源:http://www.cnblogs.com/songfeixiang/p/3733855.html   linux中open函数使用 open函数用来打开一个设备,他返回的是一个整型变量,如果 ...

  7. 【转】linux 中fork()函数详解

    在看多线程的时候看到了这个函数,于是学习了下,下面文章写的通俗易懂,于是就开心的看完了,最后还是很愉快的算出了他最后一个问题. linux 中fork()函数详解 一.fork入门知识 一个进程,包括 ...

  8. linux中 probe函数的何时调用的?

    点击打开链接 linux中 probe函数何时调用的 所以的驱动教程上都说:只有设备和驱动的名字匹配,BUS就会调用驱动的probe函数,但是有时我们要看看probe函数里面到底做了什么,还有传递给p ...

  9. LSOF查看linux中文件打开情况

    如何查看linux中文件打开情况 前言 我们都知道,在linux下,“一切皆文件”,因此有时候查看文件的打开情况,就显得格外重要,而这里有一个命令能够在这件事上很好的帮助我们-它就是lsof. lin ...

随机推荐

  1. QQ 聊天机器人小薇发布!

    简介 XiaoV(小薇)是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动: 监听多个 QQ 群消息,发现有"感兴趣"的内容时通过图灵机器人进行智能回复 监 ...

  2. 09_dubbo服务发布原理

    [ 启动服务的日志分析 ] 1.暴露本地服务 Export dubbo service com.alibaba.dubbo.demo.DemoService to local registry, du ...

  3. 十大创客与微软智能云Azure

    由微软举办的“2016年创客先锋—基于微软智能云Azure 的 SaaS 应用软件大赛”已于本周二在中关村圆满落幕.来自全国22家孵化园的创客,历时两个月,开发出百余项基于微软智能云Azure开发的创 ...

  4. jQuery的事件绑定和解绑

    1.绑定事件 $('获取的标签对象').bind('要操作的方法,  {操作的内容  是字典的形式},function(){} ') 语法: bind(type,data,fn) 描述:为每一个匹配元 ...

  5. 在win7 windows 上编译 beego 上传到 linux 去执行

    在beego的项目目录下,执行: GOOS=linux GOARCH=amd64 go build So easy!但是却搞了好久! 参考连接:http://blog.csdn.net/changji ...

  6. QT的QPropertyAnimation讲解

    m_pAnimation->setEasingCurve(QEasingCurve::Linear); //直线风格 m_pAnimation->setLoopCount(-1); //无 ...

  7. xml布局显示需要预判断,可是还没有show出来,怎么办?

    最近在实际工作中遇到了一种情况,写一个音量条,音量条显示出来之前要判断系统的音量大小,然后给音量条设置显示的位置.解决办法有两种, 第一种:    m_pHostThread>MsgAsyncC ...

  8. echarts tooltip太多会超出显示范围-解决

    以下两种解决方式,能够应对大部分出现此类问题项目 tooltip.position: 提示框浮层的位置,默认不设置时位置会跟随鼠标的位置. 可选:string, Array, Function 一.解 ...

  9. 常用的邮箱服务器(SMTP、POP3)地址、端口

    sina.com: POP3 服务器地址:pop3.sina.com.cn(端口:110) SMTP 服务器地址:smtp.sina.com.cn(端口:25) sinaVIP: POP3 服务器:p ...

  10. 利物浦VS热刺,我努力不去想,但利物浦真的在争冠

      用这张图作为开头吧,早餐的时候打开网易,苏神破门红军4-0登榜首的新闻,习惯性的点进去看看KOP的评论,有一句回复『利物浦该夺冠了,多少年了.喜欢利物浦比喜欢老婆还早,老婆都成黄脸婆了.现在带着女 ...