一、引言

  上一章执行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. 各自平台token获取解析及用户信息的获取

    1.auth根据手机号码获取auth平台session_token记统一认证的user_id与pass_id [dwliuchao1@GD-QHD-CNG152TFKX-12.55 logs]$ cd ...

  2. ThinkPHP自动令牌验证(附实例)

    一.数据表结构 user表结构如下: id username password 二.view模板部分 /view/index.html页面如下:   1 2 3 4 5 6 <form acti ...

  3. 12_java之构造方法|this|super

    01构造方法引入 * A:构造方法的引入 在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名.年龄等属性信息. 那么,创建对象就要明确属性值,那怎么解决呢?也就是在创建 ...

  4. 微信登录失败,redirect_uri域名与后台配置不一致,错误代码10003

    微信登录失败,redirect_uri域名与后台配置不一致,错误代码10003 1 先检查网页的授权域名  不要带http:// 2 检查下自己的appid是否正确 我换了appid没上传,多花了时间 ...

  5. 关于网页中行内元素的基线(baseline)、行高(line-height)、垂直对齐(vertical-align)等

    CSS基线之道 http://www.qianduan.net/css-baseline-road.html 垂直对齐:vertical-align属性 http://www.ddcat.net/bl ...

  6. 关于微软的.NET版本系列

    .net的不同版本的区分,感觉十分坑,搞开发的不能还去研究他们的版本含义或差异吧!下面为整理的一些相关内容: 一..NET的那些版本 .net framework 版本是可以向后兼容的,安装高版本的可 ...

  7. C# using语句的使用

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

  8. C# GDI+ 实现橡皮筋技术

    原文 C# GDI+ 实现橡皮筋技术 应该有很多人都在寻找这方面的资料,看看下面我做的,或许对你会有所帮助,但愿如此. 为了实现橡皮筋技术,我用了两种方法:     第一种是利用ControlPain ...

  9. Spring3X升级到Spring4X时,出现的问题

    1.1.异常描述 Description Resource Path Location Type Class 'org.springframework.http.converter.json.Mapp ...

  10. 禁止xfce4黑屏

    我在ubuntu server上安装了xfce,可是每隔十分钟电脑就会黑屏.安装了xfce自带的电源管理程序.貌似不起作用.后来从网上找到如下方法: 修改/etc/X11/xorg.conf配置文件, ...