信息安全系统设计基础第十周学习总结
一、who命令
who命令的工作流程是:打开utmp文件,针对文件,读取一条记录,显示记录,关闭文件
1.查看登录前的用户
-who am i
2.列出登录的用户
-who或-w
3.注销用户
二、附录A
1.系统级函数调用使用三种不同风格的返回错误:Unix风格、Posix风格、DNS风格
a.Unix风格的错误处理
遇到错误返回-1,函数成功完成就返回有用的结果
b.Posix风格的错误处理
只用返回值表明成功(0)或者失败(非0)。任何有用的结果都返回在通过引用传递进来的函数参数中。
c.DNS风格的错误处理
失败时返回Null指针,并且设置全局变量h_errno
三、代码理解
1.
include "csapp.h"
int main(int argc, char **argv)
{
int n;
rio_t rio;
char buf[MAXLINE];
Rio_readinitb(&rio, STDIN_FILENO);//连接标准输入和rio地址
while((n = Rio_readlineb(&rio, buf, MAXLINE)) != 0) //当成功返回时,将rio中的内容拷贝到存储器位置buf中,最多读maxline-1
Rio_writen(STDOUT_FILENO, buf, n);//把存储器位置中的数据拷贝到标注输出中。
exit(0);
}
先连接标准输入和地址rio,再根据返回值判断是否成功将rio中的一行内容拷贝到了buf中,如果是再把这一行拷贝到标准输出中,即可实现一次一行的从标准输入拷贝一个文本文件到标准输出。
2.
define RIO_BUFSIZE 8192
typedef struct {
int rio_fd; /* descriptor for this internal buf /
int rio_cnt; / unread bytes in internal buf */
char rio_bufptr; / next unread byte in internal buf /
char rio_buf[RIO_BUFSIZE]; / internal buffer */
} rio_t;
void rio_readinitb(rio_t rp, int fd)
{
rp->rio_fd = fd;
rp->rio_cnt = 0;
rp->rio_bufptr = rp->rio_buf;
}
由代码可以看出,rio_t数据结构的组成部分有文件描述符,缓存区中还没有读过的数值,下一个需要读的字节,文本行。在rio_readinitb函数中,创建了一个读缓存区,把文件描述符赋值,还没有读过的数值是0,下一个要读的字节就是文本行的起始,这代表这个读缓存区是空的。#define RIO_BUFSIZE 8192
typedef struct {
int rio_fd; / descriptor for this internal buf /
int rio_cnt; / unread bytes in internal buf */
char rio_bufptr; / next unread byte in internal buf /
char rio_buf[RIO_BUFSIZE]; / internal buffer */
} rio_t;
void rio_readinitb(rio_t *rp, int fd)
{
rp->rio_fd = fd;
rp->rio_cnt = 0;
rp->rio_bufptr = rp->rio_buf;
}
由代码可以看出,rio_t数据结构的组成部分有文件描述符,缓存区中还没有读过的数值,下一个需要读的字节,文本行。在rio_readinitb函数中,创建了一个读缓存区,把文件描述符赋值,还没有读过的数值是0,下一个要读的字节就是文本行的起始,这代表这个读缓存区是空的。