
linux
大家好,我是码农先森。守护进程,从名字就能知道,它是一种能在后台持续运行的进程,不会抢占用户的会话终端,不受终端的控制。朋友们对这个概念应该都比较熟悉了吧?要是连这个概念都还搞不懂的话,那最好重新去学习一下
linux进程管理方面的基础知识。在我们平常编程的时候,像用
php think...、
php artisan...、
php yii...等命令启动那些需要一直执行的任务时,一般都会通过nohup挂载到后台,从而保持长时间运行的状态。在Workerman里也是用类似
php index.
php start这样的命令来启动进程的,不过不同的是,它不需要借助nohup就可以挂载到后台运行。这时候可能有些朋友就会觉得好奇,它是怎么做到的?为了解答朋友们的疑问,今天我们就着重深入剖析一下Workerman守护进程的实现原理。我们先来了解一些和进程有关的知识。这些概念就像八股文一样,向来不太好理解,那我们来看个例子。当执行命令
php index.
php的时候,就产生了进程61052(这个进程的父进程是Bash进程8243,这里我们不用去管它),然后通过Fork创建了子进程61053,这个子进程的父进程就是61052,这两个进程有着共同的进程组61052和会话8243。接着调用posix_setsid函数,这个函数会为子进程61053开启新的进程组61053和新的会话61053,这里的会话可以被看作是一个新的命令窗口终端。子进程61053又通过Fork创建了子进程61054,此时进程61053就升级成了父进程,这里再次进行Fork的原因是为了避免被终端控制进程关联,因为进程61052是在终端模式下创建的,这样一来进程61054就形成了守护进程。上面举例中的进程信息,就是这段代码运行时产生的。如果有朋友看了这段代码而且比较细心的话,可能会有这样的疑问:为什么posix_setsid这个函数不在第一次Fork之前调用,要是那样的话就不用Fork两次了啊?这是因为组长进程是不能创建会话的,进程组ID 61052和进程ID 61052是相同的(也就是说当前进程就是组长进程),所以必须由子进程来创建新的会话,这一点大家一定要特别留意。