孤儿进程
父进程先于子进程结束,则子进程成为孤儿进程,此时init进程成为该进程的父进程,对进程资源进行回收。
僵尸进程
进程终止,父进程尚未回收,子进程残留资源(PCB)存放在内核中,变成僵尸进程(理论上所有进程都会经历僵尸态,因为进程的死亡与回收不同步)。
僵尸进程无法用kill命令清除,因为kill命令是用来终止进程的,而僵尸进程已经终止了。
清理僵尸进程的方法:
杀死其父进程,这个时候init进程就会对僵尸进程进行清理。
守护进程
daemon进程。通常运行与操作系统后台,脱离控制终端。一般不与用户直接交互。周期性的等待某个事件发生或周期性执行某一动作。
不受用户登录注销影响。通常采用以d结尾的命名方式。
守护进程创建步骤:
1. fork子进程,让父进程终止。
2. 子进程调用 setsid() 创建新会话
3. 通常根据需要,改变工作目录位置 chdir(), 防止目录被卸载。
4. 通常根据需要,重设umask文件权限掩码,影响新文件的创建权限。
5. 通常根据需要,关闭/重定向 文件描述符
6. 守护进程 业务逻辑。
demo:创建守护进程
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/stat.h>
void sys_err(const char *str)
{
perror(str);
exit(1);
}
int main(int argc, char *argv[])
{
pid_t pid;
int fd;
pid = fork();
if(pid > 0) exit(0);
int ret = setsid(); //创建新会话
if(pid == -1) sys_err("fork error");
ret = chdir("/home/alvin"); //改变工作目录
if (ret == -1) sys_err("chdir error");
umask(0022); //改变文件权限掩码
close(STDIN_FILENO); //关闭文件描述符0
fd = open("/dev/null", O_RDWR);
if(fd == -1) sys_err("open error");
dup2(fd, STDOUT_FILENO); //重定向stdout
dup2(fd, STDERR_FILENO); //重定向stderr
while(1); //模拟守护进程业务
return 0;
}
版权声明:本文为Blank_Shen原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。