shell:用户登录后进入到shell,一个进程,用来出理用户的请求。内核负责把用户的输入传给shell
command | more : 将命令输出分页显示。
more < filename :将标准输入重定向到filename
who(1) 中的(1)是小节编号。
man命令的联机帮助中,[-a] 的[]表示该选项不是一个必须的部分。
使用-k的 man命令 可以根据关键字搜索联机帮助。
文件描述符:进程和文件建立一条连接,这个连接叫做文件描述符。
Unix存储时间的方式:time_t数据类型。
Unix文件比较工具:cmp
对比两个文件的内容做比较
为什么对于缓冲区大小不同,同一个文件复制消耗的执行时间不同?
因此如果缓冲区,太小会执行很多的write和read函数,这些都是系统调用。用户进程在用户空间,内核位于系统空间。磁盘只能被内核访问,程序要读取磁盘上的数据只能通过系统调用read,而read的代码在内核中,所以当read发生,执行权会从用户代码转移到内核代码,执行内核代码需要时间。而且在用户模式和管理员模式中切换需要消耗很多时间。
缓冲:
磁盘的IO操作同样也消耗了很多的时间,因此,内核也同样使用缓冲技术。
所以使用write和read函数的时候都是先读到内核 的缓冲区,积累到一定数量写入磁盘。
当系统调用中出现了错误的话,内核通过全局变量errno来说明错误的类型,每个程序都可以访问到这个变量。
perror(string) 自己查找错误代码,在标准错误输出中显示相应的错误信息。string是同时要显示的描述性信息。
目录操作:opendir readdir 返回指向目录的当前记录的指针,记录类型是struct dirent。 seekdir telldir rewinddir
提取文件状态的系统调用是stat
文件内容放在struct stat的结构中。
st_mode是16位的二进制
前四位是类型 接下来是特殊标识 set-user-id set-group-id sticky 接下来是9个权限
掩码:把不需要的地方置0
把16位的看做6个二进制数。
定义宏来代表二进制 通过&来看哪些二进制位为1 将整个过程定义为宏函数
来获得到底是哪种文件
如果把用户id和组id转换成name? 在/etc/passwd中查找(可以,但是不这么做,/etc/passwd可能不会包含所有的)
用getpwuid函数来获取某个id的name
用getgrgid函数来获取gid的name
特殊位:
给/usr/bin/passwd 命令一个set-user-id位
sticky位:
对文件的创建 修改等。
第四章:
一个完整的磁盘被分为三块:
目录存放的是节点号和文件名
间接块:二级间接块 三级间接块 指数级别
第五章:设备(声卡 键盘 鼠标 显示器)和文件的相同之处 不同之处
设备同样和文件一样支持其系统调用:open read lseek close stat
与磁盘的连接有缓冲区,而与设备的连接无缓冲,进程会尽快吧终端数据发送出去。
文件描述符的属性被编码在一个整数的位中,系统调用fcntl通过读写整数来控制文件描述符。
fcntl:在指定的文件描述符的文件上执行操作cmd
F_GETFL获得当前的位集
O_SYNC是否开启缓冲
自动添加模式:可以认为是变成原子操作。
stty:
测试位 启动 和清除
第六章:
规范处理和非规范处理
非规范模式没有缓冲
3.raw模式
getchar和read是阻塞输入:一直在哪里等。
利用fcntl和open来为文件描述符启动非阻塞输入。 即:O_NDELAY标志
信号:来自内核。 生成信号的请求:
用户:ctrl+c
内核:进程执行出错,发送信号
进程:通过系统调用kill给另一个进程发送信号。
同步信号 异步信号:
信号列表:
SIGINT中断信号
SIGQUIT退出信号
SIGSEGV非法存取信号
处理信号:
1.默认处理(通常是消亡)
2.忽略
3.调用某个函数
执行完信号signal函数再返回.
第七章:
sleep的工作机制:
alarm(n) 设置一个n秒的计时器。
三类计时器:
两种间隔:初始 it_value和重复 it_interval
什么是不可靠的信号
sigaction:处理多个信号。
结构体:sigaction
sa_flags:决定在一个信号过程中,又来一个信号是阻塞还是忽略
信号挡板:
异步IO:
1.当输入就绪时候发生信号
2.aio_read
第八章:
shell:可以看做一个程序启动器。
shell执行:
一个程序调用另一个程序:execvp
注意:
execvp:内核将新程序载入到当前进程,替代了当前进程的代码和数据。
所以执行完就会退出,因此想写一个shell 一直执行命令的话,就要建立一个新的进程(fork)来执行execvp
父进程如何等待子进程的退出:调用wait()
wait的两个重要特性:
shell的实现逻辑:
exit刷新所有的流,然后调用_exit
第九章:
脚本中包含的元素:
变量 :用户输入,控制,环境。
1.shell并不将重定向标记和文件名传递给程序。
最低可用文件描述符原则
如何stdin定向到文件:
1.close then open:把文件描述符0关闭,然后再打开一个文件,根据最小原则,则是0
2.open close dup close
close(0) + dup(fd) = dup2(fd,newfd)
管道:仍然使用最低可用文件描述符
fd[0]:读管道,fd[1]:写管道。
第十一章:
同一个接口 read write 处理不同数据源的数据。
协同进程(coroutines):两个程序都持续运行,当其中的一个程序完成自己的工作后把控制区传给另一个程序。
例如:bc计算器 bc的任务是分析输入及打印,而dc则负责计算。
popen:打开一个指向进程的带缓冲的连接。
用电话来类比socket
0
客户端操作:
第十二章
第十三章:UDP
两种socket地址:Internet地址(IP和端口号)和Unix域地址(是一个文件名)
TCP和UDP
Internet地址和Unix域地址
第十四章:多线程
进程和线程:
第十五章:IPC
如果用read函数来接受用户的消息,会一直挂起,一直阻塞。
所以可以用fcntl函数将文件描述符设置为O_NOBLOCK标志 ,从而使文件描述符变成非阻塞方式。但是这样相当于系统隔一段时间就会运行一次read看有没有请求,占用了很多的处理器时间。如下:
优化:select系统调用
命名管道: