APUE(4)---文件和目录 (2)
七、函数umask
umask函数为进程设置文件模式创建屏蔽字,并返回之前的值,这是少数几个没有出错返回函数中的一个。其中cmask是9个常量(S_IR/W/XUSR、S_IR/W/XGRP、S_IR/W/XOTH)中的若干个按位“或”构成的。
#include<sys/stat.h>
mode_t umask(mode_t cmask);
//返回值:之前的文件模式创建屏蔽字
#include<apue.h>
#include<fcntl.h> #define RWRWRW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) int main(void)
{
umask();
if(creat("foo", RWRWRW) < )
{
err_sys("create error for foo");
} umask(S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
if(creat("bar", RWRWRW) < )
{
err_sys("create error for bar");
}
exit();
}
4-9 umask函数实例
UNIX系统的大多数用户从不处理他们的umask值,通常在登录时,由shell的启动文件设置一次,然后再不改变。用户可以设置umask值以控制他们所创建文件的默认权限。umask的常用值:000(任何用户都能读写文件)、002(阻止其他用户写入你的文件)、022(阻止同组成员和其他成员写入你的文件)、027(阻止同组成员写你的文件和其他用户读、写或执行你的文件)。
八、函数chmod、fchmod和fchmodat
#include <sys/stat.h>
int chmod(const char *pathname, mode_t mask);
int fchmode(int fd, mode_t mask);
int fchmodeat(int fd, char *pathname, mode_t mask);
//若成功,返回0;若出错,返回-1
这三个函数使我们可以更改现有文件的访问权限,为了改变一个文件的权限位,进程的有效用户ID必须等于文件的所有者ID,或者该进程必须具有超级用户权限。还需要注意的是chmode函数更新的知识i节点最近一次被更改的时间。按时间默认方式,ls -l列出的是最后修改文件内容的时间
#include <apue.h>
int main(void)
{
struct stat statbuf;
if(stat("foo", &statbuf) < )
{
err_sys("stat error for foo");
} if(chmod("foo", statbuf.st_mode & ~S_IXGRP|S_ISGID) < )
{
err_sys("chmode error for foo");
} if(chmod("bar", S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) < )
{
err_sys("chmode error for bar");
} exit();
}
4-12 chmode函数实例
九、函数chown、fchown、fchownat和lchown
#include <unistd.h>
int chown(const char *pathname, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int fchownat(int fd, const char *pathname, uid_t owner, gid_t group, int flag);
int lchown(const char *pathname, uid_t owner, gid_t group);
这四个函数都是用于更改文件的用户ID和组ID,如果两个参数ower和group中的任意一个为-1,则对应的ID不变。lchown和fchownat(设置了AT_SYNLINK_NOFOLLOW)更改符号连接本身,而不是更改符号连接所指向的文件的所有者。
十、文件长度和文件截断
stat结构成员st_size表示以字节为单位的文件的长度,此字段只对普通文件、目录文件和符号连接有意义。对于普通文件,长度可以为0;对于符号连接,文件长度实在文件名中的实际字节数。现今大多数现代的unix系统提供字段st_blksize和st_blocks。第一个是对文件I/O较合适的快长度;第二个是所分配的实际512字节块块数。我们提及普通文件可以包含空洞,其实际分配块数可以使用du -s来进行查看。
将一个文件截断为0可以在打开时使用O_TRUNC标志,为了阶段文件可以调用函数truncate和ftruncate。若length小于当前文件的长度,则截断;若大于当前文件的长度,则填充0。
#include <unistd.h>
int truncate(const char *pathname, off_t length);
int ftruncate(int fd, off_t length);
//若成功,返回0;若失败,返回-1
十一、文件系统
4-13 磁盘、分区和文件系统
我们可以把一个磁盘分成一个或多个分区。每个分区可以包含一个文件系统。i节点是固定长度的记录项,它包含大部分信息。
4-14 较详细的柱面组的i节点和数据块
1.途中有两个目录项指向同一个ijiedian。每个i节点都有一个连接计数,其值是指向该i节点的目录项数,只有当连接计算减少至0时,才可删除该文件。这就是为什么解除对一个文件的连接操作并不总是意味着释放该文件占用的磁盘块的原因。这也是为什么删除一个目录项的函数被称之为unlink而不是delete的原因。
2.另外一种连接类型称为符号连接(symbolic link)。符号连接文件的实际内容(在数据块中)包含了该富豪链接所指向的文件的名字。
3.i节点包含了文件有关的所有信息:文件类型、文件访问权限为、文件的长度和只想文件数据块的指针等。但是有两项重要数据存放在目录项中:文件名和i节点编号。
4.i节点编号是指向同一文件系统中相应i节点,一个目录项不能只想另一个文件系统的i节点,这就是为什么lb命令不能跨越文件系统的原因。
5.当在不更新文件系统地情况下为一个文件重命名时,该文件的实际内容并未移动,只需要构造一个指向现有i节点的新目录项,并删除老目录项,连接技术不会改变。
十二、函数link、linkat、unlin、unlinkat和remove
#include <unistd.h>
int link(const char *existingpath, const char *newpath);
int linkat(int efd, const char *existingpath, int nfd, const char *newpath, int flag);
//若成功,返回0;若失败,返回-1
创建一个只想现有文件的连接方法是使用link和linkat函数。当现有文件是符号连接时,有falg参数来控制linkat函数是创建指向现有符号连接的连接还是创建指向现有符号连接所指向的文件的连接。如果在flag参数中设置了AT_SYMLINK_FOLLOW标志,就创建指向符号连接目标的连接。创建新目录项和增加连接计数应当是一个原子操作。
#include <unistd.h>
int unlink(const char *pathname);
int unlinkat(int fd, const char *pathname, int flag);
上面两个用于接触对文件的连接,其权限要求:拥有该文件、拥有该目录或者具有超级用户权限。
#include <apue.h>
#include <fcntl.h> int main(void)
{
if(open("tempfile", O_RDWR) < )
{
err_sys("open error");
} if(unlink("tempfile") < )
{
err_sys("unlink error");
} printf("file unlinked\n"); sleep();
printf("done\n");
exit();
}
4-16 打开一个文件,然后unlink
unlink的这种特性经常被程序用来确保即使是在程序崩溃时,它所创建的临时文件也不会遗留下来。进程用open或creat创建一个文件,然后立即调用unlink,因为该文件仍旧是打开的,所以不会将其内容删除。只有当进程关闭或终止时,该文件的内容才会被删除。如果pathname是符号连接,那么unlink删除该符号连接,而不是删除由该连接所引用的文件。
我们也可以用remove函数接触对一个文件或目录的链接。对于文件,remove的功能与unlink相同;对于目录,remove的功能与rmdir相同。
#include<stdio.h>
int remove(const char *pathname);
APUE(4)---文件和目录 (2)的更多相关文章
- (三) 一起学 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学习笔记(第四章 文件和目录)
本章将描述文件系统的其他特性和文件的性质. 函数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 ...
随机推荐
- gil基本介绍
一 引子 定义: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native t ...
- Android Study 玩转百度ocr身份证识别不是梦~
前言 Today,由于昨晚喝蒙了,今天晕乎乎的为大家带来如何快速集入ocr身份证识别. 关于ocr的前世今生这里不做过多的说明,百度一抓一大把. 前期准备 百度AI开放平台ocr地址: https:/ ...
- 1.celery概述
1. 问题抛出 我们在做网站后端程序开发时,会碰到这样的需求:用户需要在我们的网站填写注册信息,我们发给用户一封注册激活邮件到用户邮箱,如果由于各种原因,这封邮件发送所需时间较长,那么客户端将会等待很 ...
- 一、linux搭建jenkins+github详细步骤
事情缘由: 现在在做的主要工作是通过jenkins+postman实现api的自动化测试,想要达到的效果是,api自动化测试定时跑脚本的同时,github有新的代码提交,jenkins会自动检测部署新 ...
- Quest *nix Xwindows
国内一般网站搜到的linux系统添加Xwindows都是无法完成的,至少我在Ct6.3上不行,也许是yum源配置不同问题 我举个站点大家自己上去看,本人就不多说了,多说也无益,. http://yao ...
- 项目通过nginx强转为https访问后,代码中重定向的连接又变成了http协议,导致点击页面按钮,后台逻辑处理完后重定向报错了
修改如下,需要在nginx对应的server下的location中增加配置,使重定向的地址协议取当前链接的协议,而不是nginx访问tomcat的协议,因为nginx访问tomcat是http的,并没 ...
- Splash Screen 加载窗体 [not finished]
对于windows开 发人员来说在打开VS开发工具时,总是先呈现一个SplashScreen界面,登上几秒钟后才打开VS的主界面.这样的效果一般是在主界面需要加载大量 资源,为避免主界面变成“死”界面 ...
- nginx-rtmp-module--------------WIKI
https://github.com/arut/nginx-rtmp-module/wiki/Directives#idle_streams ============================= ...
- U盘安装centos7.1出现dracut问题的超简单解决方法
恰好今天有空,于是抽空回忆一下之前U盘安装CENTOS7时遇到的一个大坑.U盘装系统习惯了,就顺手用大白菜工具刻了一个CentOS 7.1的minimun ISO镜像到U盘,于是噩梦开始了.如果有人像 ...
- Volatile关键字以及线程的内存可见性问题
一.Volatile关键字 作用: 当多个线程进行操作共享数据时,可以保证内存中的数据可见,即为一个线程对数据的修改对另外一个线程来说是可见的.相较于 synchronized 是一种较为轻量级的同步 ...