一、引言

  上一章执行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. BGP中IBGP和EBGP的区别和联系

    我们知道,在自治系统内部使用IGP路由协议:而在不同自治系统之间使用BGP路由协议(严格来讲,BGP不是路由协议).BGP产生的原因是为了在不同自治系统(AS)之间进行路由转发,而其中又提出了EBGP ...

  2. apt-get upgarde 和dist-upgrade的差别

    Debian/Ubuntu Linux都使用apt,升级时都是: apt-get update apt-get upgrade apt-get dist-upgrade 安装或升级系统分下面几个步骤. ...

  3. apache DOCUMENT_ROOT

    问题描述:本地页面错误,+1上正常 本地及+1apache配置 <VirtualHost *:> ServerAdmin webmaster@dummy-host.example.com ...

  4. 关于Floyd-Warshall算法由前趋矩阵计算出的最短路径反映出了算法的执行过程特性的证明

    引言:Floyd-Warshall算法作为经典的动态规划算法,能够在O(n3)复杂度之内计算出所有点对之间的最短路径,且由于其常数较小,对于中等规模数据运行效率依然可观.算法共使用n此迭代,n为顶点个 ...

  5. ubuntu安装Percona Server

    Percona Server是mysql数据库的一个衍生版本,在性能,稳定性和可管理性上都有很大的提升,目前淘宝的mysql数据库就是基于Percona Server,请原谅我这么喜欢研究淘宝的技术. ...

  6. C# using语句的使用

    使用时注意事项 ①using只能用于实现了IDisposable接口的类型,禁止为不支持IDisposable接口的类型使用using语句,否则会出现编译错误:②using语句适用于清理单个非托管资源 ...

  7. tornado 之 异步非阻塞

    异步非阻塞 1.基本使用 装饰器 + Future 从而实现Tornado的异步非阻塞 import tornado.web import tornado.ioloop from tornado im ...

  8. 好一个Time_Wait状态(TCP/IP)

    首先简单介绍一下Time_Wait是个什么鬼: 在TCP/IP协议中,我们都知道有三次握手四次挥手的过程,先来一个简单的图: 各个状态和基本的过程想必了解过TCP/IP协议的人都清楚,本次介绍的主题只 ...

  9. 如何用keytool导入证书

    先用cmd定位到 jre\lib目录下的security文件夹   例如 C:\Program Files\Java\jre1.8.0_191\lib\security 运行cmd,导入证书 keyt ...

  10. 数组和集合(四)、Map集合的使用总结

    一.概述 键值对,无序 键唯一.值不唯一 只允许存在一个Key为null元素 二.实现类 1. HashMap · 无序,数组+链表+红黑树 · 非线程安全 2. LinkedHashMap · 有序 ...