Unix/Linux 编程实践教程第五章习题

tips: 这一章的习题是真的多,花费了我许多时间,说实话,这本书的习题难度对我而言还是挺大的。这里有一些小建议,看的时候可以同时参考其他书,我参考的是《UNIX环境高级编程》和《Linux C编程一站式学习》,第二本我在最底下留下了链接,是在线版本的。然后这一章的很多题还是不太懂,如果你知道答案欢迎评论告诉我,谢谢。

5.2

现在的biff命令是用来控制命令行环境下有新邮件时是否提示,和作者的意思似乎不太一样……

5.3

试了一下, ln 只能创建设备文件的软链接,

5.4

使用mknod重新创建,比如

sudo mknod /dev/ttytest c 5 0

其中c表示字符设备,后面的两个数字分别是主设备号和从设备号。

5.5

这是一个排列组合问题,但是有个条件是lseek 操作要在write之前完成,所以并不是 4x3x2 种情况,而是 6 种可能的组合,分别是:用户A、B 顺序定位写入操作的两种情况、用户A和B定位后完成写入的四种情况,前一种结果是正确写入,后一种是A覆盖B或者B覆盖A。

5.6

do_sys_open 函数中调用 build_open_flags函数,其中

if (flags & O_APPEND)
    acc_mode |= MAY_APPEND;

校验了并设置了 O_APPEND。我查阅的是Linux 2.6的代码,在 mm\filemap.c文件中有一个函数_generic_file_aio_write,Linux 大多数文件系统的 write 函数都调用这个函数,其中调用了 generic_write_checks函数,其中

if (file->f_flags & O_APPEND)
    *pos = i_size_read(inode);

表明如果发现文件是以追加方式打开的,则将从 inode 中读取到的最新文件大小作为偏移量,从而实现了自动定位。

5.7

这个问题有点复杂,我没有搞懂,推荐一篇文章

5.8

这里我写了一段简答的代码测试了一下,代码写的比较烂,多多包涵

#include <stdio.h>;
#include <string.h>;
#include <stdlib.h>;
int main(int argc, char const *argv[])
{
    int result;
    char str1[] = "first string\n";
    char str2[] = "second string\n";
    FILE *file1 = fopen("test", "a");
    if (file1 < 0)
    {
        perror("fopen error");
        exit(1);
    }
    FILE *file2 = fopen("test", "a");
    if (file2 < 0)
    {
        perror("fopen error");
        exit(1);
    }
    result = fwrite(str1, strlen(str1), 1, file1);
    result = fwrite(str2, strlen(str2), 1, file2);
    result = fwrite(str1, strlen(str1), 1, file1);
    result = fwrite(str2, strlen(str2), 1, file2);
    fclose(file1);
    fclose(file2);
    return 0;
}

运行后结果如下:

first string
first string
second string
second string

从结果上来看 fopen仅仅是在打开文件后定位文件的末尾,每次都是在此基础上写入的。

5.9

在我的deepin15.11上分别输出:

  1. echo is on , since its bit is 1
  2. bash: /dev/lp: 没有那个文件或目录
  3. tcgetattr: Inappropriate ioctl for device
  4. bash: tty: 没有那个文件或目录

5.10

我这里两个 tty 分别连接到 /dev/pts/1/dev/pts/2,按照书上的步骤第四步显示回显开启,第五步显示回显关闭。
使用 stty 也是一样,至于原因我还不知道......

5.13

查看了APUE相关章节,发现有三种 O_SYNC,O_SYNC要求等待数据和属性都写入才返回,O_DSYNC只要求等待数据写入,O_RSYNC要求读取时缓存中的所有内容全部读取完才返回,至于习题中只要求 i-节点也就是属性的没有找到。

5.14

向终端文件写入数据就是把数据发送到设备,权限写意味着允许向终端发送数据(书上原话)。那么读权限就意味着允许接受终端数据。
可是我设置了权限以后向 ls 这样的命令可以使用,who > /dev/pts/1 就提示权限不足了。

5.15

不支持 read 和 write 的没找到,不支持 lseek 的有 gpmctl.

5.16

没看懂题目

5.17

还是没看懂题目

5.18

当我们在 shell 下运行 ls 这样的命令的时候,实际上系统会先调用fork创建一个子进程,然后在调用exec运行ls程序。这个子进程的进程控制块(PCB)是根据父进程复制而来的,所以其中控制终端的信息是一样的,因此终端处于无回显状态。而每次打开同一个文件返回的文件描述符是不一样的,是相互独立的,所以不能自动获得自动添加模式。

519

这道题想通过把终端的标准输出设置为O_APPEND,结果没有成功......

5.20

通过fcntl设置的都是当前进程如何访问设备或文件的访问控制属性,例如读、写、追加、非阻塞、加锁 等,但并不设置文件或设备本身的属性,例如文件的读写权限、串口波特率等。ioctl函数用于设置某些设备本身的属性,例如串口波特率、终端窗口大小。

5.21

/dev/null设备文件只有一个作用,往它里面写任何数据都被直接丢弃。因此保证了该命令执行时屏幕上没有任何输出,既不打印正常信息也不打印错误信息,让命令安静地执行,这种写法在 Shell 脚本中很常见。
/dev/zero是“零”设备,可以无限的提供空字符(0x00ASCII代码NUL),常用来生成一个特定大小的文件。
除此之外还有/dev/random,随机数设备,提供不间断的随机字节流,生随机数据依赖系统中断,当系统中断不足时,/dev/random设备会“挂起”,因而产生数据速度较慢,但随机性好;还有一个类似的叫/dev/urandom,不依赖系统中断,数据产生速度快,但随机性较低。

参考资料:
深入解析Linux内核I/O剖析(open,write实现)
rename代码阅读(linux 3.10.104)
Linux C编程一站式学习
Linux C 编程 —— fcntl、ioctl和stat区别
Linux中的虚拟设备/dev/null、/dev/zero、/dev/random和/dev/urandom

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容

  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,847评论 0 5
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,744评论 0 10
  • Linux系统一般有4个主要部分: 内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本...
    偷风筝的人_阅读 3,253评论 1 17
  • Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。 内核、shell和文件系统一起形成了基本...
    请爱护小动物阅读 2,570评论 0 22
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,311评论 0 9