[置顶] 文件和目录(一)--unix环境高级编程
普通文件和目录linux中最多的两类文件,linux中一共有七种类型的文件,如下:
1.普通文件
2.目录
3.字符特殊设备
4.块特殊设备
5.FIFO,又叫命名管道
6.Socket,即套接字
7.符号链接
获取一个文件的详细信息可以使用stat函数组,stat函数组包括三个函数,它们的函数原型如下:
int stat(const char* pathname,struct stat* buf);
int fstat(int filedes,struct stat* buf);
int lstat(const char* pathname,struct stat* buf);
这三个函数的功能大同小异,都是将一个文件的相关信息存入到一个stat结构体变量中,也就是提供的第二个参数。stat函数的第一个参数为文件的路径名字,fstat的第一个参数为打开文件的文件描述符,lstat函数与前面的两个函数一个最大的不同是它并不跟随符号链接,即获得的不是符号链接指向的文件的信息,而是符号链接本身的信息。stat这个结构体中的成员如下:
struct stat
{
mode_t st_mode; //文件的类型和权限
ino_t st_ino; //inode的节点号
dev_t st_dev; //设备号
dev_t st_rdev; //特殊设备号
nlink_t st_nlink; //连接数
uid_t st_uid; //文件所有者
gid_t st_gid; //文件所属组
off_t st_st_size; //文件的字节数
time_t st_atime; //文件的最后存取时间
time_t mtime; //文件的最后修改时间
time_t ctime; //文件权限的最后修改时间
long st_blksize; //最佳的IO块长度
long st_blocks; //512字节的块数
};
可以使用stat结构体中的成员的st_mode来判断文件的类型,者需要使用到<sys/stat.h>头文件中提供的一系列宏:
S_ISREG();判断普通文件
S_ISDIR(); 判断目录
S_ISCHR(); 判断特殊字符设备
S_ISBLK(); 判断块特殊设备
S_ISFIFO(); 判断FIFO
S_ISSOCK(); 判断是否为Socket
S_ISLNK(); 判断是否为符号链接
对每个文件都有九个基本相关的存取许可权,如下:
S_IRUSR 用户读
S_IWUSR 用户写
S_IXUSR 用户执行 S_IRGRP 组读
S_IWGRP 组写
S_IXGRP 组执行 S_IROTH 其他用户读
S_IWOTH 其他用户写
S_IXOTH 其他用户执行
在一个进程打开文件时,会按下面四步来进行:
1.先检查改进程的有效用户ID,如果为0,说明是超级用户,则系统给改进程充分的自由去操作文件,否则进入下一步检查。
2.检查进程的有效用户ID和文件所有者ID是否相同,如果相同则按照该文件的所有者的权限进行相关的检查,符合权限则允许操作,不符合则拒绝,直接结束。ID不同则进入下一步
3.检查进程的有效组ID和文件所属组的ID是否相同,如果相同则按照该文件组的权限进行相关检查,符合权限则允许操作,不符合则拒绝,直接结束。ID不同则进入下一步
4.按照该文件其他用户的权限进行相关检查,符合权限则允许操作,不符合则拒绝,直接结束。
这里需要说明的是有效ID和实际ID在大多数情况下是相同的,但是当设置SUID和SGID权限时,有效ID和实际ID就不同了。另外有效ID是进程的一个性质,但是实际ID是文件的一个性质。每当新建一个文件的时候,该文件的所有者和创建文件进程的有效ID相同,该文件所属的组和该进程的有效组ID相同,也可能是该文件的组和该文件所在目录所属的组相同。
access函数用进程的实际ID来测试进程对文件的权限,它的函数原型如下:
int access(const char* pathname,int mode);
如果执行成功则返回0,否则返回-1。第一个参数为所要进行测试的文件的名字,第二个参数为测试的权限,它的选择有:
R_OK 测试读许可权
W_OK 测试写许可权
X_OK 测试执行许可权
F_OK 测试文件是否存在
mode可以是上面的几个参数按位或的结果。需要注意的是access函数只测试进程的实际ID,而不测试进程的有效ID。一定要注意这一点,否则这可能会在某些情况下给我们造成困惑。
相信在linux下面使用过umask命令的朋友们,都对umask函数的作用一定也了解。umask函数的作用就是在进程执行时,调整umask的值,给进程创建的文件设置合适的权限,当该进程结束时,umask仍保持原来系统中的值不变。它的函数原型如下:
mode_t umask(mode_t cmask);
它的返回值是原来的umask的值,这也是linux系统中少数几个没有出错返回值的几个函数之一。它的作用是从创建文件时指定的权限中减掉umask中指定的权限。比如,进程创建文件时指定的用户权限是:
rwxrwxrwx
而且umask指定的值是022,则改进程创建的文件的权限就是755。
chmod和fchmod函数用来改变文件的权限,它们的函数原型如下:
int chmod(const char* pathname,mode_t mode);
int fchmod(int filedes,mode_t mode);
chmod在文件名上操作,而fchmod在文件描述符上进行操作。第二个参数用来指定文件要修改的权限,它是下面几个参数的按位或:
S_ISUID 是否为SUID
S_ISGID 是否为SGID
S_ISVTX 是否为SBIT S_IRWXU 用户读写执行
S_IRUSR 用户读
S_IWUSR 用户写
S_IXUSR 用户执行 S_IRWXG 组读写执行
S_IRGRP 组读
S_IWGRP 组写
S_IXGRP 组执行 S_IRWXO 其他读写执行
S_IROTH 其他读
S_IWOTH 其他写
S_IXOTH 其他执行
该函数如果执行成功则返回0,若出错返回-1。关于SUID,SGID和SBIT的相关说明请参考另一篇博客:
http://blog.csdn.net/xiaocainiaoshangxiao/article/details/17378611
用户在使用进程修改当前文件的权限时,进程的有效用户ID必须等于文件的所有者,或者是0即超级用户。
chown,fchown以及lchown用来改变文件的所有者和所属的组,它们的函数原型如下:
int chown(const char* pathname, uid_t owner, gid_t group);
int fchown(int filedes , uid_t owner, gid_t group);
int lchown(const char* filename ,uid_t owner ,gid_t group);
当该函数执行成功时,返回0,出错则返回-1。修改文件的用户ID需要据进程的有效用户ID为超级用户。当进程的有效用户ID等于文件的用户ID时,可以修改该文件组ID。
[置顶] 文件和目录(一)--unix环境高级编程的更多相关文章
- 《UNIX环境高级编程(第3版)》
<UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison ...
- [置顶] 文件和目录(二)--unix环境高级编程读书笔记
在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...
- (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- apue.h头文件(UNIX环境高级编程)
在看UNIX环境高级编程是,碰到一个头文件"apue.h",搜一下别人的帖子,其实apue.h是作者自己写的一个文件,包含了常用的头文件,系统不自带.其中包含了常用的头文件,以及出 ...
- UNIX环境高级编程笔记之文件I/O
一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...
- 【UNIX环境高级编程】文件I/O
[UNIX环境高级编程]文件I/O大多数文件I/O只需要5个函数: open.read.write.lseek以及close 不带缓冲的I/O: 每个read和write都调用内核中的一个系统调用 1 ...
- Unix环境高级编程:文件 IO 原子性 与 状态 共享
参考 UnixUnix环境高级编程 第三章 文件IO 偏移共享 单进程单文件描述符 在只有一个进程时,打开一个文件,对该文件描述符进行写入操作后,后续的写入操作会在原来偏移的基础上进行,这样就可以实现 ...
- (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
随机推荐
- HDU 1863 畅通工程(最小生成树,prim)
题意: 给出图的边和点数,要求最小生成树的代价,注:有些点之间是不可达的,也就是可能有多个连通图.比如4个点,2条边:1-2,3-4. 思路: 如果不能连通所有的点,就输出‘?’.之前以为每个点只要有 ...
- ActionBarSherlock的学习笔记(一) -------------- ActionBarSherlock的简要介绍
1. 介绍 ActionBarSherlock 是Android compatibility library 的一个扩展, 不知道什么原因 Android 兼容开发包没有包含ActionBar. 所以 ...
- 【转】《APUE》第三章笔记(4)及习题3-2
原文网址:http://www.cnblogs.com/fusae-blog/p/4256794.html APUE第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了. ...
- web.config配置详细说明
(一).Web.Config是以XML文件规范存储,配置文件分为以下格式 1.配置节处理程序声明 特点:位于配置文件的顶部,包含在<configSections>标志中. 2.特定应 ...
- POJ 1083 Moving Tables
题意:一个建筑物里有400个房间,房间都在一层里,在一个走廊的两侧,如图,现在要搬n张桌子,告诉你每张桌子是从哪个屋搬到哪个屋,搬桌子的线路之间不可以有重叠,问最少搬几次. 解法:贪心.一开始觉得只要 ...
- RMQ(dp)
我一开始是不知道有这么个东西,但是由于最近在学习后缀数组,碰到一道题需要用到后缀数组+RMQ解决的所以不得不学习了. 原理:用A[1...n]表示一组数,dp[i][j]表示从A[i]到A[i+2^j ...
- 火狐和google游览器的 hack独有识别 css
先来看google的: /* 这针对于webkit内核的游览器.包括苹果谷歌游览器等*/ @media screen and (-webkit-min-device-pixel-ratio:0) { ...
- 国内外开源与 SaaS ,团队协作平台、项目管理工具整理
整理一些开源与 SaaS ,团队协作平台.项目管理工具.还有哪些比较好的工具,可以推荐下? 名称 地址 备注 asana https://asana.com/ 国外 basecamp https:// ...
- auto printer 自动打字机效果
前段时间在知乎上看到了一个打字机的效果,所以,心血来潮,自己也来写了一个打字机的效果. 比较简单,但还有待优化的地方,因为自己感觉这个效果不够炫,等哪天想出好的点子了.再来更新…… 代码效果预览地址: ...
- bzoj 3143 [Hnoi2013]游走(贪心,高斯消元,期望方程)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3143 [题意] 给定一个无向图,从1走到n,走过一条边得到的分数为边的标号,问一个边的 ...