- 进程ID是进程唯一标识,可以通过提供的getpid等函数获得进程ID等信息
- 函数fork用来创建子进程,子进程返回0,父进程返回子进程ID,通过判断fork返回值是否为0可以用来区分子进程逻辑和父进程逻辑
- 当今子进程和父进程通常使用写时复制实现数据段等内存区域的共享,只在相关内存区域改变时才创建相关副本进行修改
- fork之后父进程和子进程的执行是不固定的,具体要取决于内核的调度算法,如果需要同步则需要进程间通信来完成
- 标准输出的缓冲会在fork时复制到子进程空间中,这会导致子进程中也存在相关缓冲,导致父进程和子进程具有部分相同输出
- fork之前打开的文件描述符,会在fork之后由父进程和子进程共享。避免冲突的方式通常有两种场景:1,fork之后进行进程同步;2,关闭各自文件描述符,继续各自的逻辑
- 不管进程如何终止,最后都会执行内核中的一段代码。这段代码为相应进程关闭所有打开描述符,释放它所使用的存储器等
- 防止僵尸进程出现的两种方法:1,使用wait waitpid等待子进程终止(子进程先死);2,两次fork,第二次fork的子进程由init进程收养,init进程负责子进程的善后工作(父进程先死)
- IPC(Inter-Process Communication,进程间通信)
- 由于fork时并不能保证执行顺序,所以通常需要使用某些方式对进程进行同步
- exec在fork之后执行,用于替换子进程的进程空间中的数据等信息+ #! 解释器脚本的好处:1,隐藏具体实现,比如底层其实是awk;2,如果在shell中调用awk,会导致fork和wait,会导致更多开销;3,可以用除了/bin/sh之外的其他shell进行脚本编写
- system函数可以直接调用命令,内部实际是fork+exec
- 进程调度。nice值越小,优先级越高
网友评论