一、引言

  上一章执行I/O的基本函数(打开文件、读文件和写文件),本章将描述文件系统的其他特征和文件的性质,我们将从stat函数开始,并逐个说明stat结构的每一个成员以了解文件的所有属性。在此过程中,我们将说明修改这些属性的各个函数。

二、函数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 fstatat(int fd, const char *restrict pathname, struct stat *restrict buf, int flag);
//若成功,返回0;若失败,返回-1

  若pathname给出绝对路径,则buf返回stat对应文件的信息;需要注意两点:lstat返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息;fstatat当AT_SYMLINK_NOFOLLOW被设置时,不会跟随符号连接,而是同lstat一样,返回符号连接本身的有关信息,当AT_FDCWD被设置时,并且pathname是一个相对路径时,会从当前路径开始计算pathname。stat结构的基本形式如下:

struct stat
{
mode_t st_mode;
ino_t st_ino;
dev_t st_dev;
dev_t st_rdev;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
off_t st_size;
struct timespec st_atime;
struct timespec st_mtime;
struct timespec st_ctime;
blksize_t st_blksize;
blkcn_t st_blocks;
};

三、文件类型

  1.普通文件     :最常用的文件类型

  2.目录文件     :这种文件包含了其他文件的名字以及指向与这些文件有关信息的指针。

  3.块特殊文件  :每次访问以固定长度为单位

  4.字符特殊文件 :这种类型的文件提供对设备不带缓冲的访问。系统中的设备要么是字符特殊文件,要么是块特殊文件

  5.FIFO      :用于进程间通信,也称为命名管道

  6.套接字        :用于进程间网络通信

  7.符号连接      :这种类型的文件指向另一个文件

#include "apue.h"

int main(int argc, char *argv[])
{
int i;
char *ptr;
struct stat buf; for(i = ; i < argc; i++)
{
printf("%s:", argv[i]);
if(lstat(argv[], &buf) < )
{
err_ret("lstat error");
continue;
} if(S_ISREG(buf.st_mode))
{
ptr = "regular";
}
else if(S_ISDIR(buf.st_mode))
{
ptr = "directory";
}
else if(S_ISCHR(buf.st_mode))
{
ptr = "character special";
}
else if(S_ISBLK(buf.st_mode))
{
ptr = "block special";
}
else if(S_ISFIFO(buf.st_mode))
{
ptr = "fifo";
}
else if(S_ISLNK(buf.st_mode))
{
ptr = "symbolic link";
}
else if(S_ISSOCK(buf.st_mode))
{
ptr = "socket";
}
else
{
ptr = "unknown mode";
}
printf("%s\n",ptr);
}
}

4-3 对每个命令行参数打印文件类型

四、设置用户ID和设置组ID

  与一个进程相关联的ID有6个或更多:实际用户ID和实际组ID:我们实际上是谁?有效用户ID和有效组ID和附属组ID:用于文件访问权限检查;保存的设置用户ID和保存的设置组ID:用于exec函数保存。

  每个文件有一个所有者和组所有者,由st_uid和st_gid指定。

五、文件访问权限

  所有文件类型都有访问权限,很多人认为只有普通文件有访问权限,这是一种误解。一个文件的权限分为三部分:用户、组和其他,分别由读、写和执行组成。文件的权限有以下规则:

1.我们用名字打开任一类型文件时,对改名字中包含的每一个目录,包括他可能隐含的当前工作目录都应具有执行权限,这也是为什么对于目录执行权限位常备称作搜索位的原因。对于目录而言:读权限意味获得在该目录中所有文件名的列表;执行权限意味进入该目录。

2.为了在目录中创建一个新文件,我们必须具有该目录的写权限和执行权限

3.为了删除目录中的一个文件,我们必须具有该目录的写权限和执行权限,而对于该具体文件而言,则不需要读、写权限。

六、函数access和faccessat

  当用open函数打开一个文件时,内核以进程的有效用户ID和有效组ID为基础执行其访问权限的测试。有时进程也希望按其实际用户ID和实际组ID来测试其访问能力,access和faccessat就是为了实现这种功能,不管有效用户ID和有效组ID是什么,都是以实际用户ID和实际组ID来进行访问权限测试。

#include <unistd.h>
int access(const char *pathname. int mode);
int faccessat(int fd, const char *pathname. int mode);
//成功返回0;失败返回-1
#include <apue.h>
#include <fcntl.h> int main(int argc, char *argv[])
{
if(argc != )
{
err_quit("usage: a.out <pathname>");
} if(access(argv[], R_OK) < )
{
err_ret("access error for %s", argv[]);
}
else
{
printf("read access ok\n");
} if(open(argv[], O_RDONLY)<)
{
err_ret("open error for %s", argv[]);
}
else
{
printf("open for reading %s\n", argv[]);
}
exit();
}

4-8 access函数实例

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

  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)---文件和目录 (3)

    十三.函数rename和renameat #include <stdio.h> int rename(const char *oldname, const char *newname); ...

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

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

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

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

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

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

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

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

  10. 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. javscript踩过的坑 - 记录

    1. js中, ‘==’ 运算符是对大小写敏感的

  2. OD 实验(六) - 对一个程序的破解

    程序: 双击进行安装,安装过程默认就好了 安装完成 运行程序 输入 User 为 sch01ar,点击 Create 点击 Log In 这里显示为未注册版本 看看未注册版本有哪些功能被限制 这里会显 ...

  3. Flask之模板

    2 了解Jinja2模板 知识点 模板使用 变量 过滤器 web表单 控制语句 宏.继承.包含 Flask中的特殊变量和方法 3.1 模板 在前面的示例中,视图函数的主要作用是生成请求的响应,这是最简 ...

  4. Python 小知识点(7)--类的创建方式

    1. 创建类的第1方式(常用) class Foo(object): def func(self): print("Hello Foo") 2.创建类的第2方式 def func( ...

  5. 第二章ARP——地址解析协议

    本章我们要讨论的问题是只对 T C P / I P协议簇有意义的I P地址.数据链路如以太网或令牌环网都有自己的寻址机制(常常为 48 bit地址),这是使用数据链路的任何网络层都必须遵从的.一个网络 ...

  6. DataSnap 连接池 DSServer1Disconnect

    DataSnap Server DSServer1Disconnect 这个函数什么时候执行? void __fastcall TServerContainer1::DSServer1Disconne ...

  7. Git 搭建私有仓库

    简介: 如果你不想把自己的代码公开让别人阅读.使用,也不想花钱购买 GitHub 私有仓库,那么你就需要自己动手做一个了. 当然你也可以使用 Coding.net ,上面可以创建免费的私有仓库.( 今 ...

  8. Java实现主线程等待子线程

    本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明: 1.使用Thread的join()方法,join()方法会阻塞主线程继续向下执行. 2.使用Java.util.concurrent中的C ...

  9. iOS开发基础控件--UITextField

    001 //初始化textfield并设置位置及大小 002   UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20 ...

  10. Binormal - 副法线

    [Binormal - 副法线] Binormal是垂直于Normal.Tangent平面的直线.Normal.Binormal.Tangent三条线构成一个坐标系. 参考:http://202.11 ...