APUE(4)---文件和目录 (1)
一、引言
上一章执行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)的更多相关文章
- (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- [04]APUE:文件与目录
[a] stat / lstat / fstat #include <sys/stat.h> int stat(const char *restrict pathname, struct ...
- (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- apue chapter 4 文件和目录
1.文件信息结构体 struct stat{ mode_t st_mode; //file type and permissions ino_t st_ino; //i-node number (se ...
- APUE(4)---文件和目录 (3)
十三.函数rename和renameat #include <stdio.h> int rename(const char *oldname, const char *newname); ...
- APUE(4)---文件和目录 (2)
七.函数umask umask函数为进程设置文件模式创建屏蔽字,并返回之前的值,这是少数几个没有出错返回函数中的一个.其中cmask是9个常量(S_IR/W/XUSR.S_IR/W/XGRP.S_IR ...
- apue学习笔记(第四章 文件和目录)
本章将描述文件系统的其他特性和文件的性质. 函数stat.fstat.fstatat和lstat #include <sys/stat.h> int stat(const char *re ...
- [APUE]文件和目录(中)
一.link.unlink.remove和rename 一个文件可以有多个目录项指向其i节点.使用link函数可以创建一个指向现存文件连接 #include <unistd.h> int ...
- [APUE]文件和目录(上)
一.文件权限 1. 各种ID 我在读这一章时遇到了各种ID,根据名字完全不清楚什么意思,幸好看到了这篇文章,http://blog.csdn.net/ccjjnn19890720/article/de ...
- 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 ...
随机推荐
- sqlldr加载 数据文件的字段超出最大长度
SQLLOAD数据的时候,建表给的字段给够了,建表已经给到VHARCHAR2(1024)了,实际数据是VHARCHAR2(256).加载报错"数据文件的字段超出最大长度"查了半天, ...
- CDN之多边缘节点负载均衡--学习笔记
一.剧情 剧情是这样的,本次的多边缘节点负载均衡实验,1个LVS四层负载均衡集群和1个Nginx为反向代理的七层负载均衡集群,由Bind dns解析作为 主负载均衡服务器,调度两个集群,中间层有一台W ...
- win iso download
http://rufus.akeo.ie/ window iso download http://win.86tyu.cn/ylmf32win7.html
- 深入浅出 Java Concurrency (14): 锁机制 part 9 读写锁 (ReentrantReadWriteLock) (2)
这一节主要是谈谈读写锁的实现. 上一节中提到,ReadWriteLock看起来有两个锁:readLock/writeLock.如果真的是两个锁的话,它们之间又是如何相互影响的呢? 事实上在Reen ...
- HTTP与TCP/IP的区别
TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据.关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:“我们在传输数据时,可以只 ...
- redis hash结构如何设置过期时间
Redis中有个设置时间过期的功能,即通过setex或者expire实现,目前redis没有提供hsetex()这样的方法,redis中过期时间只针对顶级key类型,对于hash类型是不支持的,这个时 ...
- LeetCode题解 #8 String to Integer (atoi)
又是一道恶心的简单题. 一开始没想到这么多情况的,幸好LeetCode是个很人性化的oj,能让你知道你在哪个case上错了,否则一辈子都过不了. 考虑不周到只能一个个补了. 列举一下恶心的case / ...
- Failed to start component [StandardEngine[Catalina].
出现以下的错误的原因: 检查 web.xml文件,应该是<filter>和<filter-mapping>或者<servlet>和<servlet-mappi ...
- Python_安装官方whl包和tar.gz包
Windows环境: 安装whl包:pip install wheel -> pip install **.whl 安装tar.gz包:cd到解压后路径,python setup. ...
- 解决OpenFeign默认无法上传文件的问题
前言 最近在项目中使用OpenFeign时,发现其不支持文件上传功能.网上找了很多资料,最后找到feign-form和feign-form-spring的解决方案.但其默认只支持单文件上传,不支持多文 ...