进程的概念
相关命令
pstree显示bash进程
ps显示进程,以快照方式,显示某一瞬间进程状态
ps aux
top显示实时进程信息,会动态变化
父子孤尸
进程标识
会重用,但不会立马重用PID
父进程为bash
su root:切换用户为root
chmod u+s idroot:给idroot加设置用户ID位
rwx变为rws
切换回tarena普通用户
用tarena运行有用户ID位的idroot,有效用户ID对应为root(不是PID),该进程有root的权限
创建子进程
fork函数 创建子进程
给父进程返回子进程PID,给子进程返回0
进程数量上限
父进程执行内容为
fork成功之后,创建的子进程执行内容为
fork的返回值pid在父进程中为子进程编号35151,在子进程中为0
增加return 0进程结束
让子进程专门执行的内容,写到if分支,然后return 0
没有限制子进程的执行
二的三次方,2X2X2
代码区存在变量a=10,子进程将a改为20,父进程再来访问a的值变为20,有没有可能因为共享内存导致子进程将父进程的值更改?
没有可能,因为代码区不可修改,代码区存储的是具有常属性的,已经初始化的全局变量或者静态局部变量/函数地址/字面值常量(字符串)的地址
子进程拷贝后,物理内存不同,但是映射到相同的虚拟地址,两个进程有各自的内存映射表
相当于父楼的6单元101与子楼的6单元101
子进程更改自己内存的值,不影响父进程
进程中内核会维护进程表,进程表中有文件描述符表,进程调用open函数后,生成文件描述符对应的文件表项和v节点,此时创建子进程,子进程拥有子进程的进程表,该进程表的文件描述符表复制于父进程,父子进程相同的文件描述符对应同一个文件表项,子进程也可通过文件描述符操作该文件,父子进程共用一个文件表项,共享读写位置
只有当文件表项对应的所有文件描述符被关闭,文件表项才会被释放(dup同理),所以子进程最好也close(fd);
进程结束,系统会自动将打开的文件关闭,但对于运行时间久的进程来说,未被释放的文件表项会一直占用内存
孤儿院进程演示
12.04以前孤儿院进程pid为1
僵尸进程演示
通过ps aux查看
按回车,结束父进程,父子进程都被回收
程序结束,系统内核会自动收子进程僵尸