一、mkdir和rmdir函数

#include <sys/types.h>
#include <sys/stat.h>
int mkdir(const char *pathname, mode_t mode);
返回值:成功0,失败-1.

mkdir函数创建一个空目录,.和..目录是自动创建的。所指定的文件存取许可权mode由进程的文件方式创建屏蔽字修改(命令行执行umask可查看) 常见的错误是指定与文件相同的mode(只指定读,写许可权)。但是对于目录来说必须设置一个执行许可权位,以允许存取该目录中的文件名。

用rmdir函数可以删除一个目录

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

如果调用此函数使目录的连接计数为0并且没有其他进程打开该目录,则释放此目录占用的空间。如果在连接计数为0时,有一个或多个进程打开了该目录,则在此函数返回前删除最后一个连接及.和..项。并且,在此目录中不能再创建新文件。但是在最后一个进程关闭它之前并不释放此目录(即使有进程打开该目录,它们在此目录下,也不能执行其他操作,因为使rmdir函数成功执行,该目录必须是空的)。

二、读目录

对某个目录具有存取许可权的任一用户都可读该目录,但是只有内核才能写目录(防止文件系统发生混乱)。一个目录的写许可权和执行许可权决定了能否在该目录中创建文件和删除文件,但是它们并不表示可以读写文件本身。 目录的实际格式依赖于UNIX的具体实现,早期的系统,如V7结构:每个目录项是16个字节,其中14个字节是文件名,2个字节是i节点编号数。UNIX现在包含了一套与读目录相关的例程,他们是POSIX.1的一部分。

#include <sys/types.h>
#include <dirent.h> DIR *opendir(const char *pathname); 返回值:成功则为指针,出错则返回NULL struct dirent *readdir(DIR *dp); 返回值:成功则为指针,若在目录尾或出错则为NULL void rewinddir(DIR *dp); 该函数用来设置参数dir 目录流目前的读取位置为原来开头的读取位置 int closedir(DIR *dp);
返回值:成功0,失败-1

定义在头文件<dirent.h>中的dirent结构与实现有关,SVR4和4.3+BSD定义此结构至少包含下列两个成员:

struct dirent{
ino_t d_ino; /* i-node number */
char d_name[NAME_MAX+1]; /* null-terminated filename */
}

POSIX.1并没有定义d_ino,因为这是一个实现特征,POSIX.1在此结构中之定义d_name项

SVR4没有将NAME_MAX定义为一个常数--其值依赖于目录所在的文件系统。并且通常可用fpathconf函数取得。在BSD类文件系统中,NAME_MAX的常用值是255.但是文件名是以null字符结束的,所以在头文件如何定义数组d_name并无多大关系 DIR是一个内部结构类似于FILE。 opendir执行初始化操作,使第一个readdir读目录中的第一个目录项,目录中各目录项的顺序与实现有关,它们通常并不按字母顺序排列。 以下是一个简单的文件遍历程序:

三、chdir、fchdir和getcwd函数

每个进程都有一个当前工作目录,此目录是搜索所有相对路径名的起点。

#include <unistd.h>
int chdir(const char *pathname);
int fchdir(int filedes);
返回值:成功0,失败-1.

因为当前工作目录是一个进程的属性,所以它只影响调用chdir的进程本身并不影响其他进程 内核只为每个进程保存当前工作目录的i节点编号以及设备标识,并不保存该目录的完整路径名。getcwd函数可以从当前工作目录开始,找到其上一级的目录,然后读其目录项,直到该目录项中的i节点编号数与当前工作目录i节点编号数相同,这样就找到了其对应的文件,按照这种方法逐层上移直到遇到根,这样就得到了当前工作目录的绝对路径名。

#include <unistd.h>
char *getcwd(char *buf, size_t size);
返回值:成功buf,失败NULL

此函数两个参数,缓存地址buf,缓存的长度size。该缓存必须有足够的长度一容纳绝对路径名加一个null终止符,否则返回出错。

四、特殊设备文件

字符特殊文件:这种文件用于系统中某些类型的设备。
块特殊文件:这种文件典型的用于磁盘设备。系统中的所有设备或者是字符特殊文件,或者是块特殊文件。 st_dev和st_rdev这两个字段经常引起混淆

  • 每个文件系统都由其主、次设备号而为人所知。设备号所用的数据类型是借本系统数据类型dev_t。
  • 我们通常可以使用两个大多数实现都定义的宏:major和minor来存取主、次设备号。这就意味着我们无需关心这两个数是如何存放在dev_t对象中的。
  • 系统中每个文件名的st_dev值是文件系统的设备号,该文件系统包含了该文件名和其对应的i节点。
  • 只有字符特殊文件和块特殊文件才有st_rdev值。此值包含该实际设备的设备号 以下程序为每个命令行参数打印设备号,另外如果参数引用的是字符特殊文件或块特殊文件,则也打印该特殊文件的st_rdev值。
#include <sys/types>
#include <sys/stat.h>
#include <stdio.h> int main(int argc, char *argv[])
{
int i;
struct stat buf; for (i = 1; i< argc; i++) {
printf("%s: ", argv[i]);
if (lstat(argv[i], &buf) < 0) {
fprintf(strerr, "lstat error");
continue;
} printf("dev= %d/%d", major(buf.st_dev), minor(buf.st_dev)); if (S_ISCHR(buf.st_mode) || I_ISBLK(buf.st_mode)) {
printf(" (%s) rdev = %d/%d", (S_ISCHR(buf.st_mode)) ? "character" : "block", major(buf.st_rdev), minor(buf.st_rdev));
} printf("\n");
} return 0;
}

五、sync和fsync函数

传统的UNIX实现在内核中设有缓冲存储器,大多数磁盘IO都通过缓存进行。当将数据写到文件上时,通常该数据先由内核复制到缓存中,如果该缓存尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓存以便存放其他磁盘块数据时,再将该缓存排入输出队列,然后待其到达队首时,才进行实际的IO操作。这种输出方式被称之为延迟写。当系统发生故障时这种延迟可能会造成文件更新内容的丢失。为了保证磁盘上实际文件系统与缓存中内容的一致性,UNIX提供了sync和fsync两个系统函数。

#include <unistd.h>
void sync(void);
int fsync(int fileds);
返回值: 成功0,失败-1

sync只是将所有修改过的块的缓存排入写队列,然后就返回,并不等待实际IO操作结束。
系统精灵进程(通常称为update)一般每隔30秒调用一次sync函数。 函数fsync只引用单个文件,它等待IO结束,然后返回。

六、文件存取许可权位小结

以下是所有文件存取许可权位:

  

[APUE]文件和目录(下)的更多相关文章

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

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

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

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

  3. 【转】java 文件 读取目录下的所有文件(包括子目录)

    转自:http://www.cnblogs.com/pricks/archive/2009/11/11/1601044.html import java.io.File; import java.io ...

  4. ftp删除目录和文件,目录下有文件删除提示【550 Remove directory operation failed.】

      注意:目录下有文件,直接删除目录会失败,提示550 Remove directory operation failed. 必须先将目录下的文件都删除,才能删除目录   ftp命令行: ftp删除目 ...

  5. APUE 文件和目录

    文件和目录 Unix 所有的文件都对应一个 struct stat,包含了一个文件所有的信息. #include <sys/stat.h> struct stat { mode_t st_ ...

  6. APUE ☞ 文件和目录

    粘着位(Sticky Bit) S_ISVTX位被称为粘着位.如果一个可执行程序文件的这一位被设置了,程序第一次运行完之后,程序的正文部分的一个副本仍被保存在交换区(程序的正文部分是机器指令).这使得 ...

  7. php下载文件夹目录下的文件

    最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...

  8. Android开发学习---android下的数据持久化,保存数据到rom文件,android_data目录下文件访问的权限控制

    一.需求 做一个类似QQ登录似的app,将数据写到ROM文件里,并对数据进行回显. 二.截图 登录界面: 文件浏览器,查看文件的保存路径:/data/data/com.amos.datasave/fi ...

  9. shell命令:删除当前.sh文件所在目录下的zip包,并且重新打包

    filepath=$(cd ")"; pwd) packagePath="$filepath"/package zipPath="$filepath& ...

随机推荐

  1. 恋爱虽易,相处不易:当EntityFramework爱上AutoMapper

    剧情开始 为何相爱? 相处的问题? 女人的伟大? 剧情收尾? 有时候相识即是一种缘分,相爱也不需要太多的理由,一个眼神足矣,当EntityFramework遇上AutoMapper,就是如此,恋爱虽易 ...

  2. AutoFac在项目中的应用

    技能大全:http://www.cnblogs.com/dunitian/p/4822808.html#skill 完整Demo:https://github.com/dunitian/LoTCode ...

  3. 【算法】C语言实现数组的动态分配

    C语言实现数组的动态分配 作者:白宁超 2016年10月27日20:13:13 摘要:数据结构和算法对于编程的意义不言而喻,具有指导意义的.无论从事算法优化方向研究,还是大数据处理,亦或者网站开发AP ...

  4. EF上下文对象线程内唯一性与优化

    在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,这也加是很多人的代码中习惯在使用上下文对象时,习惯将对象建立在using中,也是为了尽早释放上下文对象, 但是如果有一个业务逻辑调用 ...

  5. BPM配置故事之案例4-子表

    公司渐渐对采购管理重视起来了,新招聘了采购主管老李,老李对现有的申请表很不满意,要求将申请物资和申请原因改成物资明细表 物资明细表 小明只好继续致电大毛-- 大毛:把申请物资和申请原因删掉,新增一个数 ...

  6. 从国内流程管理软件市场份额看中国BPM行业发展

    随着互联网+.中国制造2025.工业4.0等国家战略的支持与引导,企业在数字经济时代的信息化表现惊人,越来越多企业认识到,对于企业的发展来说,信息自动化远远还不够,企业的战略.业务和IT之间需保持高度 ...

  7. GSD_WeiXin(高仿微信)应用源码

    高仿微信计划:已经实现功能 1.微信首页(cell侧滑编辑.下拉眼睛动画.下拉拍短视频.点击进入聊天详情界面) 2.通讯录(联系人字母排序.搜索界面) 3.发现(朋友圈) 4.我(界面) 待实现功能( ...

  8. asp.net core 实战之 redis 负载均衡和"高可用"实现

    1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...

  9. ORACLE从共享池删除指定SQL的执行计划

    Oracle 11g在DBMS_SHARED_POOL包中引入了一个名为PURGE的新存储过程,用于从对象库缓存中刷新特定对象,例如游标,包,序列,触发器等.也就是说可以删除.清理特定SQL的执行计划 ...

  10. Linux 权限设置chmod

    Linux中设置权限,一般用chmod命令 1.介绍 权限设置chmod 功能:改变权限命令.常用参数: 1=x(执行权execute) 2=w(写权write) 4=r(读权Read) setuid ...