20145227《信息安全系统设计基础》第十周学习总结
第十章 系统级I/O
附录A中主要讲了这本书中的错误处理方式,有一个方法——错误处理包装函数,这个思想很有意思,相当于给基本函数再套上一层皮,然后run这个皮,发现了错误就终止,完全正确的话就跟没有这层皮一样。
错误处理
1.错误处理风格
(1)Unix风格
遇到错误后返回-1,并且将全局变量errno设置为指明错误原因的错误代码;
如果成功完成,就返回有用的结果。
(2)Posix风格
返回0表示成功,返回非0表示失败;
有用的结果在传进来的函数参数中。
(3)DNS风格
有两个函数,gethostbyname和gethostbyaddr,失败时返回NULL指针,并设置全局变量h_errno。
(4)错误报告函数
void unix_error(char *msg) /* unix-style error */
{
fprintf(stderr, "%s: %s
", msg, strerror(errno));
exit(0);
}
/* $end unixerror */
void posix_error(int code, char *msg) /* posix-style error */
{
fprintf(stderr, "%s: %s
", msg, strerror(code));
exit(0);
}
void dns_error(char *msg) /* dns-style error */
{
fprintf(stderr, "%s: DNS error %d
", msg, h_errno);
exit(0);
}
void app_error(char *msg) /* application error */
{
fprintf(stderr, "%s
", msg);
exit(0);
}
2.错误处理包装函数
Unix风格
成功时返回void,返回错误时包装函数打印一条信息,然后退出。
void Kill(pid_t pid, int signum)
{
int rc;
if ((rc = kill(pid, signum)) < 0)
unix_error("Kill error");
}
Posix风格
成功时返回void,错误返回码中不会包含有用的结果。
void Pthread_detach(pthread_t tid) {
int rc;
if ((rc = pthread_detach(tid)) != 0)
posix_error(rc, "Pthread_detach error");
}
DNS风格
struct hostent *Gethostbyname(const char *name)
{
struct hostent *p;
if ((p = gethostbyname(name)) == NULL)
dns_error("Gethostbyname error");
return p;
}
视频学习内容总结
ls命令
- ls功能:读取文件名和文件属性,按照字典序排序后输出。
- 常用的命令行选项:
ls -l 以长格式的形式查看当前目录下所有可见文件的详细属性
ls -a 列出的内容包含以“.”开头的文件
ls -lu 最后访问时间
ls -s 以块为单位的文件大小
ls -t 按时间排序
ls -F 显示文件类型
ls -l
- ls -l 的输出每行都包含7个字段
模式 每行的第一个字符表示文件类型,“-”代表普通文件,“d”代表目录文件。
链接数 指该文件被引用的次数
文件所有者 指出文件所有者的用户名
组 指出文件所有者所在的组
大小 显示文件的字节数
最后修改时间 文件的最后修改时间
文件名 文件名
ls -l
可以显示当前目录下目录或文件的详细属性信息
实践
首先把老师的压缩包在虚拟机中解压缩,运行每个代码
cp
- 查看帮助文档
man cp
- cp的作用就是读取一个文件的内容到存储器,在新的地址创建空白文件,再从存储器将内容写入新文件。(如下图把ls1.c复制,存为lc.c文件)
ls1和ls2
- ls1程序的作用是在当前目录显示文件名(未带参数直接显示,带参数的存入argc)
- ls2不仅显示了文件名,还用来显示文件的详细信息,比如用户名、群组名、大小、创建时间、读写权限等。
echostate.c和setecho.c
echostate.c
- 功能:查看在命令行中输入命令时是否可见,可见返回1,否则返回0
setecho.c
- 设置回显位的状态,命令行参数为y则开启,否则关闭。
- 标准输入的文件描述符为0.
- 使用tcgetattr()函数和termios结构体可获得标准输入的属性。
- 使用tcsetattr()函数和termios结构体可以将更改后的属性设置重新写回标准输入。
ioctl函数
- ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。
- ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数控制设备的I/O通道。
- 查看帮助文档
man isatty
man ioctl
- isatty:判断一个文件描述符是否指向一个终端
- ioctl:控制驱动器
- 程序运行结果
filesize
- filesize代码用st_size成员来计算文件的字节数大小,gcc后有一个警告,调用正常。
fileinfo
- fileinfo代码这个功能用来实现显示文件信息,建立了一个stat数据结构。先判断命令是否有操作数,有的话才能继续进行下去,如果没有报错就打印出来相关文件信息,报错就用perror将报错信息打印出来。
spwd命令
- spwd的功能是列出当前目录。
who命令
- 这个代码的思想是,从UTMP_FILE文件中读取想要的信息到存储器中,然后再用标准输出函数打印到屏幕上,最后关闭文件。
- 程序运行结果
本周代码托管链接
https://git.oschina.net/20145227/IS-Design-20145227/tree/master/ch10
本周代码总数
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0 | 2/2 | 20/20 | |
第二周 | 100/100 | 1/3 | 20/40 | |
第三周 | 200/300 | 1/4 | 22/62 | |
第五周 | 200/500 | 1/5 | 22/84 | |
第六周 | 274/774 | 1/6 | 22/106 | |
第七周 | 127/901 | 2/8 | 22/128 | |
第八周 | 50/951 | 2/10 | 22/150 | |
第九周 | 418/1369 | 2/12 | 22/172 | |
第十周 | 485/1854 | 2/14 | 22/194 |