apue第四章学习总结

4.1.若以stat函数去替换lstat函数,会发生:

原来的目录路径:

$:~/workspace/apue2/include$ ls -l apue.h abc
lrwxrwxrwx 1 mikedeng mikedeng 6 10月 25 18:33 abc -> apue.h
-rw-r--r-- 1 mikedeng mikedeng 4736 5月 28 2005 apue.h

当执行程序时:

$:~/workspace/apue2/include$ ./stat abc apue.h
./stat: regular
abc: regular
apue.h: regular

可见,使用stat函数是不会识别出符号链接的文件的。

4.2.如果创建屏蔽字777

过程和结果一目了然:

$:~/workspace/apue2/include$ umask 002
$:~/workspace/apue2/include$ umask
0002
$:~/workspace/apue2/include$ umask 777
$:~/workspace/apue2/include$ touch a
$:~/workspace/apue2/include$ ll
总用量 64
drwxr-xr-x 3 mikedeng mikedeng 4096 10月 25 18:55 ./
drwxr-xr-x 32 mikedeng mikedeng 4096 5月 30 2005 ../
---------- 1 mikedeng mikedeng 0 10月 25 18:55 a
lrwxrwxrwx 1 mikedeng mikedeng 6 10月 25 18:33 abc -> apue.h
-rw-r--r-- 1 mikedeng mikedeng 4736 5月 28 2005 apue.h
drwxrwxr-x 5 mikedeng mikedeng 4096 10月 20 17:28 dirls/
-rw-r--r-- 1 mikedeng mikedeng 2021 10月 20 17:57 error.c
-rwxrwxr-x 1 mikedeng mikedeng 12142 10月 20 17:57 readerror*
-rw-rw-r-- 1 mikedeng mikedeng 804 10月 20 17:55 readerror.c
-rwxrwxr-x 1 mikedeng mikedeng 7911 10月 25 18:42 stat*
-rw-rw-r-- 1 mikedeng mikedeng 860 10月 25 18:41 stat.c
-rwxrwxr-x 1 mikedeng mikedeng 7236 10月 20 17:40 ugid*
-rw-rw-r-- 1 mikedeng mikedeng 105 10月 20 17:39 ugid.c
$:~/workspace/apue2/include$ cat a
cat: a: 权限不够

4.3.验证关闭你所创建的一个文件的读权限,看能不能访问自己的文件文件

如图:

$:~/workspace/apue2/include$ cat a
sddsdsdsdsddsdsdsdsddsdsdsdsddsdsdsdsddsdsdsdsddsdsdsdsddsdsdsdsddsdsdsdsddsdsdsdsddsdsdsdsddsdsdsdsddsdsdsd
$:~/workspace/apue2/include$ ls -l a
-rw-rw-r-- 1 mikedeng mikedeng 109 10月 25 18:58 a
$:~/workspace/apue2/include$ chmod 151 a
$:~/workspace/apue2/include$ cat a
cat: a: 权限不够

4.4.创建foo和bar,在运行umask程序,发生什么效果

我们可以看一下:

$ touch foo
$ touch bar
$ ls -l foo bar
-rw-rw-r-- 1 mikedeng mikedeng 0 10月 25 19:08 bar
-rw-rw-r-- 1 mikedeng mikedeng 0 10月 25 19:08 foo
$ ./umask
$ ls -l foo bar
-rw-rw-r-- 1 mikedeng mikedeng 0 10月 25 19:09 bar
-rw-rw-r-- 1 mikedeng mikedeng 0 10月 25 19:09 foo
$ umask
0002

其实原因并不复杂,我们知道umask是仅对当下进程产生或打开的文件产生作用,对于已经创建的文件,它们的权限位不会发生改变。

4.5.目录和符号链接诶的长度是否可以为0?

  • 对于目录,由于里面肯定包含.和..两个目录节点,所以长度肯定不为0;
  • 而对于符号链接,文件长度是文件名中的实际字节数。

4.6.重写cp程序,使得复制时不把空洞文件复制过去

程序如下:

#include "apue.h"
#include <fcntl.h>
#include <unistd.h> #define RWRWRW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
int main(int argc,char* argv[]){ int sourcefd,destfd; //源文件描述符,目的文件描述符
ssize_t nread; //读取文件节点
ssize_t nwrite; //写入文件节点
char* buf; //字符缓冲区
int len = 1; //一次读入的文件长度
struct stat st; //文件性质结构体 if(argc != 3){
err_quit("usage: ./cp <source filename> <destination path>");
} if((sourcefd = open(argv[1],O_RDONLY)) < 0){ //只读性质打开第一个文件
err_quit("can't open source file.");
} if((buf = (char*)malloc(len)) == NULL){ //为字符缓冲区开辟空间
err_quit("can't malloc space.");
} umask(0);
if((destfd = creat(argv[2],RWRWRW)) < 0){
err_quit("can't create destination file.");
} while((nread = read(sourcefd,buf,len)) > 0){
if(buf[0] != 0){
if((nwrite = write(destfd,buf,nread)) < 0){
err_quit("Write Error.");
}
}
} if(nread < 0){
err_quit("Read Error!\n");
} free(buf); //释放文件指针
close(nread); //关闭文件读取进程
close(nwrite); //关闭写入文件节点
return 0;
}

4.7.可能是一些干货,问的是到底创建的文件与shell重定向的文件到底受不受umask的影响?

当创建新的core文件时,内核对其访问权限有一个默认设置,在本例中是rw-r--r--。这一默认值可能会也可能不会被umask的值修改。

shell对创建的重定向的新文件(core.copy)也有一个默认的访问权限,本例中为rw-rw-rw-,并且这个值总是被当前的umask修改,本例中umask为02.

4.9.unlink是如何修改到引用文件的状态更改时间的?

其实unlink的实质只是在对于所引用的文件的引用计数减1,如果引用计数没有减为0,它是不会被释放的,所以这时就能更改到所引用文件的状态时间。

4.17.有些程序创建输出文件之前,先删除该文件以确保该文件名不存在。那如果是/dev/fd/1呢?

$:/dev/fd$ ll
总用量 0
dr-x------ 2 mikedeng mikedeng 0 10月 25 17:52 ./
dr-xr-xr-x 9 mikedeng mikedeng 0 10月 25 17:52 ../
lrwx------ 1 mikedeng mikedeng 64 10月 25 17:52 0 -> /dev/pts/0
lrwx------ 1 mikedeng mikedeng 64 10月 25 17:52 1 -> /dev/pts/0
lrwx------ 1 mikedeng mikedeng 64 10月 25 17:52 2 -> /dev/pts/0
lrwx------ 1 mikedeng mikedeng 64 10月 25 21:19 255 -> /dev/pts/0

可见,/dev目录关闭了一般用户的写访问权限,以避免用户删除目录中的文件,这就意味着unlink失败。

apue第四章学习总结的更多相关文章

  1. apue第七章学习总结

    apue第七章学习总结 1.main函数 程序是如何执行有关的c程序的? C程序总是从main函数开始执行.main函数的原型是 int main(int argc,char *argv[]); 其中 ...

  2. apue第六章学习总结

    apue第六章学习总结 1.关于阴影文件与口令 在口令文件当中,常见的字段有(以root为例): root(用户名):x(加密口令):0(uid):0(gid):root(注释字段):/root(用户 ...

  3. 《Linux内核设计与实现》第四章学习笔记

    <Linux内核设计与实现>第四章学习笔记           ——进程调度 姓名:王玮怡  学号:20135116 一.多任务 1.多任务操作系统的含义 多任务操作系统就是能同时并发地交 ...

  4. 《Linux内核设计与实现》第四章学习笔记——进程调度

                                                                        <Linux内核设计与实现>第四章学习笔记——进程调 ...

  5. Spring实战第四章学习笔记————面向切面的Spring

    Spring实战第四章学习笔记----面向切面的Spring 什么是面向切面的编程 我们把影响应用多处的功能描述为横切关注点.比如安全就是一个横切关注点,应用中许多方法都会涉及安全规则.而切面可以帮我 ...

  6. 《码出高效:Java开发手册》第四章学习记录,内容想当的多,前后花了几天的时间才整理好。

    <码出高效:Java开发手册>第四章学习记录,内容想当的多,前后花了几天的时间才整理好. https://naotu.baidu.com/file/e667435a4638cbaa15eb ...

  7. 鸟哥的linux私房菜——第四章学习

    ******************第四章学习****************** [热键] 1.Tab键:命令补全:文件补全: 2.Ctrl+c:中断目前指令: 3.Ctrl+d:离开当前文本界面: ...

  8. Day4 《机器学习》第四章学习笔记

    决策树 前几天学习了<机器学习>的前三章,前三章介绍机器学习的基础知识,接下来,第四章到第十章介绍一些经典而常用的机器学习方法,这部分算是具体的应用篇,第四章介绍了一类机器学习方法——决策 ...

  9. 第三周学习java第四章学习总结及体会!

    第三周java 2第四章的学习总结: 一.主要内容(类与对象): 1.类: 2.构造方法与对象的创建: 3.类与程序的基本结构: 4.参数传值: 5.对象的组合: 6.实例成员与类成员: 7.方法重载 ...

随机推荐

  1. Linux(12.1-12.6)学习笔记

    第十二章 并发编程 如果逻辑控制流在时间上重叠,那么他们就是并发的.应用级并发在以下情况中发挥作用: 访问慢速I/O设备. 与人交互. 通过推迟工作以降低延迟. 服务多个网络客户端. 在多核机器上进行 ...

  2. beta阶段140字评论

    第一组 奋斗吧兄弟  有三种生态环境可以选择,动物还可以放大缩小,增加了许多趣味性.寓教于乐 第二组金州勇士   考试系统很贴近学生生活,不过这种系统现有也挺成熟了,其实我觉得做一个报考系统可能更讨喜 ...

  3. 倒戈了,转投简书 -------->

    深情自白 还记得数月前那个月黑风高的晚上,笔主偶遇简书,被那婀娜多姿的Markdown输出深深吸引不能自拔,从此立下毒誓要两边同时发布.然而天有不测风云(这边的太丑),前思后想寝食难安之后作出决定,正 ...

  4. ArrayList List<T> T[] Array

    ArrayList    其实就是一个存储obj列表的类 ArrayList 接受 null 作为有效值并且允许重复的元素. 不保证会对 ArrayList 排序. 在执行需要对 ArrayList ...

  5. Web fonts

    不同类型的文件字体: Embedded OpenType (glyphicons-halflings-regular.eot) Scalable Vector Graphics (glyphicons ...

  6. VMware打卡虚拟机提示“此虚拟机可能已被复制或移动”

    使用VMware打开虚拟机时出现下图的页面,我来解释一下这三个选项按钮的区别与作用. "我已移动虚拟机"     //表示打开后的虚拟的网卡的mac地址不变,如果复制本地的,同时开 ...

  7. 工作的思考十五:升职前需要做的准备(TeamLeader)

    当一个人在公司的工作年限以及经验的积累到达一个程度的时候,升职其实是件高兴的事,但面临角色的转变需要提前做些准备的. 其实如果你对你的职业规划很清楚的话,那么你就应该在升职之前就会开始进行角色的转换. ...

  8. 10、面向对象以及winform的简单运用(isMdicontainer的设置、timer控件进行倒计时的制作)

    IsMdicontainer的设置 这是对于整个窗体的设置,将一个窗体的IsMdicontainer设置为true之后,再打开新窗体便可以让新窗体被父容器包括在内. 操作方法: 1)先建立一个子窗体C ...

  9. 第一节Unity3D简介

    Unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎.Unity ...

  10. Easyui使用记录

    一天就这搞了这几行. 1. if else 可以嵌套: 2. 子页面调用父页面js,需要使用top.父页面js的方法. <script type="text/javascript&qu ...