进程
文件锁
进程锁
- 进程锁:记录一个PID文件,避免两个进程同时运行的文件
- 与线程锁、互斥量和自旋锁不同
如果两个进程一起执行可能会出问题
- 与线程锁、互斥量和自旋锁不同
- 作用:协调进程的运行
孤儿进程
- 孤儿进程:指其父进程执行完成或被终止后仍然继续运行的进程
- 即父进程不在了,子进程还在运行
- 作用:刻意使进程称为孤儿进程,这样可以使其与其父进程回话脱钩,成为[[Reading/Understand-Linux-Process/进程#守护进程|守护进程]]
僵尸进程
当一个程序完成它的工作并且终止的时候,其父进程需要调用
wait()
或waitpid()
来获得子程序的终止状态 - 如果子进程退出,而父进程没有调用这两个函数来获取子进程的状态信息,那么子进程的进程描述符就会一直保存在系统中,这样的进程称为僵尸进程 死不瞑目
守护进程
- 守护进程:后台服务进程
- 有一个很长的生命周期来提供服务,关闭中断并不会影响到该服务的进行
守护进程的实现
- 在启动程序后面添加
&
- 进程自己
fork()
然后结束父进程 - 与终端、进程组、会话分离
- 子进程一般都会从父进程继承这些信息,与环境分离的方法:
setsid()
- 同样的会进程文件掩码,手动清除掩码的方法:
umask(0)
每一个进程在创建的时候都会绑定一个终端,并且属于一个进程组(进程组有GID,并且GID=进程组长的PID),这些进程组在一个会话中,如果是子进程一般都会从父进程继承这些信息
- 子进程一般都会从父进程继承这些信息,与环境分离的方法:
使用Nohup
- 使用nohup命令,让程序以守护进程运行
- 程序运行后忽略SIGNUP信号->终端的关闭不会影响进程的运行
类似的命令还有
disown
- 程序运行后忽略SIGNUP信号->终端的关闭不会影响进程的运行
进程间通信
进程间通信
IPC(Interprocess Communication),指进程间协作的各种方法,包括共享内存、信号量或Socket
管道(Pipe)
管道是进程间通信的最简单方式,任何京城的标准输出都可以作为其他进程的输入
信号(Signal)
- 是进程间通信的一种方法
- 同样可以用于内核给进程发送信息
- 告诉进程发生了什么事件,而不会传递任何数据
信号种类
$ kill -l
HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP TSTP CONT CHL
在命令行中止一个程序我们一般摁Ctrl+c,这就是发送SIGINT信号,而使用kill命令呢?默 认是SIGTERM,加上-9参数才是SIGKILL
消息队列(Message)
和传统消息队列类似,但是在内核实现
共享内存(Shared Memory)
信号量(Semaphore)
- 一个整型计数器
调用
wait
时计数器-1,减到0时开始阻塞进程,从而达到进程、线程间的协作
套接口(Socket)
也就是通过网络来通信,这也是最通用的IPC,不要求进程在同一台服务器上