cd .. rm cp ldd x.c ll man 2/3 man 7 signal touch ls -l x.xxx 查看文件信息 ulimit -a tty ifconfig netstat 查看进程: ps aux/ajx (a、u、j、x的含义) 实时显示进程动态: top 杀死进程: kill 查看管道缓冲大小命令: ulimit a 查看系统定义的信号列表: kill –l ipcs ipcrm 查看指定进程的 LWP 号: ps –Lf pid 查看当前 pthread 库版本: getconf GNU_LIBPTHREAD_VERSION
Ctrl+L 清空终端 Shift+G 调到文件末尾 I/O vim插入 Esc :wq 保存并退出
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S3TsaJKO-1640703132781)(https://i.loli.net/2021/10/25/TPBzc4wdDGRfsNu.png)]
gcc test.cpp -o app ./app gcc test.c ./a.out
gcc test.c -E -o test.i gcc test.i -S -o test.s gcc test.s -c -o test.o gcc test.o -o test.out ./test.out gcc test.c //一步其实都干了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lVL1Twfp-1640703132787)(https://i.loli.net/2021/10/25/86SiVNMKa31erdC.png)]
gcc main.c -o app -I ./include/ -l calc -L ./lib/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q7Z1NFJS-1640703132790)(https://i.loli.net/2021/10/27/MVR4lkZKwG3yqaX.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FqHRjYRw-1640703132796)(https://i.loli.net/2021/10/28/PcElBxMd5wV4UbT.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XynEG9TP-1640703132797)(https://i.loli.net/2021/10/28/nHAeoVQbMhWj5wd.png)]
lesson09-lesson12有函数解读
rwx,读写可执行
0777 八进制,每个7表示该位用户的权限,rwx都有就是111(7)
stat:返回文件的信息
lstat:获取软连接文件的信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2vZ3GLhi-1640703132801)(https://i.loli.net/2021/10/30/PdAIOj35MzogGLX.png)]
在子进程中返回0
如何区分父进程和子进程:通过fork的返回值。
在父进程中返回-1,表示创建子进程失败,并且设置errno
实际上,更准确来说,Linux 的 fork() 使用是通过写时拷贝 (copy- on-write) 实现。
写时拷贝是一种可以推迟甚至避免拷贝数据的技术。
内核此时并不复制整个进程的地址空间,而是让父子进程共享同一个地址空间。
只用在需要写入的时候才会复制地址空间,从而使各个进行拥有各自的地址空间。
也就是说,资源的复制是在需要写入的时候才会进行,在此之前,只有以只读方式共享。
注意:fork之后父子进程共享文件,
fork产生的子进程与父进程相同的文件文件描述符指向相同的文件表,引用计数增加,共享文件偏移指针。
1.fork()函数的返回值不同
父进程中: >0 返回的子进程的ID
子进程中: =0
2.pcb中的一些数据
当前的进程的id pid
当前的进程的父进程的id ppid
信号集
某些状态下:子进程刚被创建出来,还没有执行任何的写数据的操作
- 用户区的数据
- 文件描述符表
管道指匿名管道
ls | wc -l
管道的特点(ppt)
管道是半双工的:数据传输指数据可以在一个信号载体的两个方向上传输,但是不能同时传输
匿名管道只能在具有公共祖先的进程(父进程与子进程,或者两个兄弟进程,具有亲缘关系)之间使用
管道数据结构是循环队列
创建匿名管道:
int pipe(int pipefd[2]);
读管道:
管道中有数据,read返回实际读到的字节数。
管道中无数据:
写端被全部关闭,read返回0(相当于读到文件的末尾)
写端没有完全关闭,read阻塞等待
写管道:
管道读端全部被关闭,进程异常终止(进程收到SIGPIPE信号)
管道读端没有全部关闭:
管道已满,write阻塞
管道没有满,write将数据写入,并返回实际写入的字节数
FIFO、有名管道、命名管道
FIFO 在文件系统中作为一个特殊文件存在,但 FIFO 中的内容却存放在内存中
当使用 FIFO 的进程退出后,FIFO 文件将继续保存在文件系统中以便以后使用
mkfifo xxx int mkfifo(const char *pathname, mode_t mode);
有名管道的注意事项:
1.一个为只读而打开一个管道的进程会阻塞,直到另外一个进程为只写打开管道
2.一个为只写而打开一个管道的进程会阻塞,直到另外一个进程为只读打开管道
读管道:
管道中有数据,read返回实际读到的字节数
管道中无数据:
管道写端被全部关闭,read返回0,(相当于读到文件末尾)
写端没有全部被关闭,read阻塞等待
写管道:
管道读端被全部关闭,进行异常终止(收到一个SIGPIPE信号)(读端都关闭了,就说明没有人去读数据,那就不能往管道里写数据,写了也没啥用。当初设计的时候就是这样设计的。)
管道读端没有全部关闭:
管道已经满了,write会阻塞
管道没有满,write将数据写入,并返回实际写入的字节数。
将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件
lesson25
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
匿名映射:不需要文件实体进程一个内存映射,与上面fd参数有关
lesson26
kill:
int kill(pid_t pid, int sig); 功能:给任何的进程或者进程组pid, 发送任何的信号 sig
raise
int raise(int sig); 功能:给当前进程发送信号
abort
void abort(void); 功能: 发送SIGABRT信号给当前的进程,杀死当前进程
alarm
unsigned int alarm(unsigned int seconds); 功能:设置定时器(闹钟)。函数调用,开始倒计时,当倒计时为0的时候,函数会给当前的进程发送一个信号:SIGALARM SIGALARM :默认终止当前的进程,每一个进程都有且只有唯一的一个定时器。
setitimer
int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value); - 功能:设置定时器(闹钟)。可以替代alarm函数。精度微妙us,可以实现周期性定时
sighandler_t signal(int signum, sighandler_t handler); 功能:设置某个信号的捕捉行为
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 检查或者改变信号的处理。信号捕捉
共享内存和内存映射的区别
共享内存可以直接创建,内存映射需要磁盘文件(匿名映射除外)
共享内存效果更高
内存
所有的进程操作的是同一块共享内存。
内存映射,每个进程在自己的虚拟地址空间中有一个独立的内存。
数据安全
- 进程突然退出
共享内存还存在
内存映射区消失
- 运行进程的电脑死机,宕机了
数据存在在共享内存中,没有了
内存映射区的数据 ,由于磁盘文件中的数据还在,所以内存映射区的数据还存在。
生命周期
- 内存映射区:进程退出,内存映射区销毁
- 共享内存:进程退出,共享内存还在,标记删除(所有的关联的进程数为0),或者关机
如果一个进程退出,会自动和共享内存进行取消关联。
互斥量:mutex 是 mutual exclusion的缩写
blog
网卡具有MAC地址(独一无二的 48 位串行号),属于OSI地址第二层
Media Access Control Address,直译为媒体存取控制位址,也称局域网地址、
以太网地址、物理地址或硬件地址
48 位(6个字节)、12 个 16 进制数。如:00-16-EA-AE-3C-40;,其中前 3 个字节,16 进制数 00-16-EA 代表网络硬件制造商的编号,后 3 个字节,16进制数 AE-3C-40 代表该制造商所制造的某个网络产品(如网卡)的系列号。
IP 地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址
32 位的二进制数,4个字节
每个 IP 地址包括两个标识码(ID),即网络ID 和主机 ID。同一个物理网络上的所有主机都使用同一个网络 ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机 ID 与其对应。
ABC类地址,0对应当前主机、255是广播地址不算
子网掩码:子网掩码只有一个作用,就是将某个 IP 地址划分成网络地址和主机地址两部分
端口:IP 地址比作一间房子,端口就是出入这间房子的门,给每个应用程序提供一个端口,进程唯一的编号
一个应用程序可以有多个端口
周知端口\注册端口\动态端口\私有端口
字节序分为大端字节序(Big-Endian) 和小端字节序(Little-Endian)
大部分都采用小端
小端字节序则是指整数的高位字节存储在内存的高地址处,而低位字节则存储在内存的低地
址处。
小端: 整数:0x01020304 (01是整数的高位) 内存-> 04 03 02 01
大端字节序是指一个整数的最高位字节(23 ~ 31 bit)存储在内存的低地址处,低位字节(0 ~ 7 bit)存储在内存的高地
址处;
三次握手发生在客户端连接的时候,当调用connect(),底层会通过TCP协议进行三次握手。
ACK、SYN(握手)、FIN(挥手)
发送时候seq随机生成,两边seq不同
收到时候ack收到确认后在上一步sep+1(SYN=1),通信时候+数据长度
客户端和服务器ack不同,谁确认收到谁+,发的时候不变
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h4CMfslb-1640703132806)(https://i.loli.net/2021/11/13/PYzUb6u4DV5m1sf.png)]
网络IO阶段1:数据就绪
→
操作系统 TCP接收缓冲区
→
网络IO阶段2:数据读写(根据应用程序和内核的交互方式)
→
应用程序
阻塞 != 同步
非阻塞 != 异步
陈硕:在处理 IO 的时候,阻塞和非阻塞都是同步 IO,只有使用了特殊的 API 才是异步 IO。(select、poll、epoll是同步的)
Linux异步IO借口:aio_read() aio_write()
一个典型的网络IO接口调用,分为两个阶段,分别是“数据就绪” 和 “数据读写”,数据就绪阶段分为阻塞和非阻塞,表现得结果就是,阻塞当前线程或是直接返回。
同步表示A向B请求调用一个网络IO接口时(或者调用某个业务逻辑API接口时),数据的读写都是由请求方A自己来完成的(不管是阻塞还是非阻塞);异步表示A向B请求调用一个网络IO接口时(或者调用某个业务逻辑API接口时),向B传入请求的事件以及事件发生时通知的方式,A就可以处理其它逻辑了,当B监听到事件处理完成后,会用事先约定好的通知方式,通知A处理结果。