Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性。
1. 交互进程是由一个Shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。
2. 批处理进程和终端没有联系,是一个进程序列。
3. 监控进程(也称系统守护进程)是Linux系统启动时运行的进程,并常驻后台。例如,httpd是著名的Apache服务器的监控进程。
init是Linux系统操作中不可缺少的程序之一。所谓的init进程,它是一个由内核启动的用户级进程。
内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。 其它所有进程都是init进程的子孙。init进程是不可杀的(即不能通过kill 命令杀掉进程)!
守护进程的创建:
1 创建子进程,父进程退出。
if(fork() > 0){ exit(0) };
2 子进程变成孤儿进程,被init进程收养,子进程在后台运行。
3 子进程创建新会话。
if(setsid() < 0){ exit(-1) }
子进程成为新的会话组长,脱离原来的终端。
4 更改当前目录
chdir("/");
或 chdir("/tmp");
守护进程在后台运行,其工作目录不能被卸载需重新设定当前工作目录。
5 在子进程中调用umask()重设文件权限掩码为0。
if(umask(0) < 0){
exit(-1);
}
文件权限掩码设置为0,只影响当前进程。
6 关闭当前打开的文件描述符。
for(i=0; i < getdtablesize(); i++ ) { close(i) }
关闭所有从父进程继承的打开的文件描述符,已脱离终端,stdin/stdout/stderr无法再使用。
来源:CSDN
作者:白緢
链接:https://blog.csdn.net/CSDN_liu_sir/article/details/103464241