Unix-Linux 编程实践教程

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系统调用

命名管道:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值