守护进程:
也叫精灵进程,运行在后台的进程,独立于控制终端并周期性执行某种个任务。脱离终端是为了避免进程在运行过程中信息不会被终端打断,在整各系统关闭时退出。
原理:
守护进程是脱离控制终端的,就会造成在shell终端里造成程序已运行结束的假象,之后的工作都在子进程中进行,用户在shell终端中可以执行其他命令。父进程先退出会造成子进程成为孤儿进程,当系统发现孤儿进程时,自动由1号进程(init)进程收养,变成init进程的子进程继续运行。
init进程是内核启动的第一个用户级的进程,内核启动后,装入内存,运行,初始化所有设备驱动、数据结构,启动init完成进程内核部分。在linux中可使用命令 ps axj查看系统中进程
a:列出当前进程及其他用户进程;
x:有/无控制终端的进程;
j:列出作业相关信息;
当tpgid的值为-1,表示没有控制终端的守护进程。
创建新的会话:
#include<unistd.h>
pid_t setsid( )
setsid的作用:1、使进程脱离原会话
2、让进城脱离进程组控制
3、进程脱离终端控制
在fork子进程是会拷贝父进程的会话信息、进程组、控制终端,当父进程退出时,这些拷贝仍然存在,setsid()函数能使它完全独立。
过程:
1、重新设定文件权限:fork()函数会继承父进程文件权限信息掩码,应把文件权限设为0;
umask(0);
2、fork()子进程,父进程退出。先fork子进程再调用setsid,使子进程不为进程组leader。
3、setsid();
4、更改根目录 chdir("/");
5、关闭对应的文件表述附表:子进程会继承父进程中一些已打开的文件,但父进程退出后,文件不会被子进程,守护进程读写,会消耗内存资源,守护进程和终端失联后,不能从终端输入,输出,文件描述符表0、1、2应关闭。
创建成功:
有新会话,进程id是会话id;有新进程组,当前进程id为组id;与控制终端脱离。