一、基本概念:
1、 守护进程:也就是通常说的Daemon进程、精灵进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程名字一般以d结尾。
2、 进程组:是一个或多个进程的集合。进程组的生命周期到进程组中最后一个进程终止, 或加入其他进程组为止。通常由shell的管道将几个进程编为一组。
3、 会话(会话周期):是一个或多个进程组的集合。这些进程组共享一个控制终端。一个会话只能有一个前台进程组。一个会话开始于用户登录,终止于用户退出。
4、 控制终端:会话的领头进程打开一个终端之后, 该终端就成为该会话的控制终端。和控制终端建立连接的会话领头进程称为控制进程。一个会话只能有一个控制终端。产生在控制终端上的输入和信号将发送给会话的前台进程组中的所有进程。
5、 孤儿进程:一个父进程已经终止的进程成为孤儿进程(orphan process),每当系统发现孤儿进程的时候,就会有一号进程init收养,然后他就成为init进程的子进程。
二、父子进程继承关系(fork):
1、 子进程是父进程的拷贝。子进程继承了父进程的所有东西,如文件描述符,进程组ID,会话ID,用户ID,有效ID,控制终端,当前目录,文件方式创建屏蔽字,环境等等。
2、 父子进程的五大区别:
1) fork的返回值
2) 进程ID
3) 父进程设置的锁,子进程不能继承
4) 子进程的未决警告被清空
5) 子进程的未决信号设置为空集
三、编程规则:
1、 创建(fork)子进程,父进程推出(exit)
保证子进程不是一个进程组的首进程。
2、 在子进程中创建新会话(setsid)
调用setsid新建会话成功后,调用进程将成为会话组ID和进程组ID,并且失去控制终端。
3、 改变当前目录为根目录(chdir)
4、 重设文件掩码(umask)
5、 关闭不再需要的文件描述符
四、代码实现: