Linux 最常见的知识点。
在Day 1
-
Stat
显示文件或文件系统的详细信息· 比l s输出的信息更详细
-
Dup2/Fcntl
dup复制文件描述符
-
程序和进程-并行和并发
并发:单核cpu 分成若干个时间碎片,多个进程轮询使用cpu的时间碎片 并行:多核cpu,单个进程可以同时利用多个cpu的资源
-
pcb
进程控制块,用于维护进程的各种信息和数据,分为内核区和用户数据区 内核区 Pid等信息 用户区 栈 堆 代码段 未初始化的变量/已经初始化的变量 动态库加载区 Env环境参数 命令行参数
-
进程状态的切换
初始态 进程被fork的时间非常短 就绪 有执行资格,没有执行权,等待CPU 执行 有执行资格,有执行权,获得了CPU 挂起 没有执行资格,没有执行权 等待拥有执行资格,等待CPU 终止 进程结束
-
fork函数
创建子进程 返回值有两个值 父进程:返回子进程的pid 子进程:返回0 父子进程的内容,除了pid,其他的一模一样 刚fork之后,两个地址空间用户区数据完全相同 后续进行了其他不同的操作后,各个进程地址空间的数据是完全独立的
-
循环创建多个子进程
想要创建确定数量的子进程,需要使用break 子进程执行代码的位置上从父进程fork出子进程之后的代码开始
-
ps/kill
Ps $ps aux | grep ‘’ 查询进程 Kill Kill -9 终止一个进程 -9 = -SIGKILL
-
进程间的数据共享
如果多个进程对物理内存的变量只进行读操作,则互不影响 如果有写操作,则写的是副本
进程间是否共享全局变量
否 -
exec函数族
fork子进程后,子进程往往调用exec函数以执行另一个程序,该进程完全由新程序代换,新程序从main函数开始执行 简言之,用fork创建新进程,exec函数执行新程序 该进程的pid并不变 exec只是用另一个新程序替换了当前进程的正文/数据/堆/栈段 有六种不同的exec函数
-
孤儿进程和僵尸进程
孤儿进程 没有父进程的进程是孤儿进程,孤儿进程会被init领养,成为一个准守护进程(后台执行) 守护进程是脱离终端子后台执行的进程,随系统启动,其父进程(ppid)通常是init进程 守护进程的几个特征 后台运行 成为 process group leader 成为session leader fork一次或者两次 chdir到/ umask 系统进程init会自动收养任何孤儿进程 僵尸进程 父进程或者,但是不给子进程收尸(wait/waitpid), 子进程就会变成僵尸进程 当子进程退出时,父进程需要wait/waitpid系统调用来读取进程的exit status,然后子进程被系统回收 如果父进程没有wait,则子进程将成为僵尸进程,内核会释放这个子进程的所有资源,但子进程中进程表中仍然有一个它的pcb,记录pid和退出状态等信息,导致pid一直被占用 系统能使用的pid数量是有限的,如果僵尸进程太多,则无法新启进程 很多能重启 的服务就是用wait/waitpid实现的
-
wait/waitpid函数回收子进程资源
waitpid会暂时停止目前进程的执行,直到有信号来或者子进程结束