孤儿进程、僵尸进程以及守护进程

孤儿进程

父进程先于子进程结束,则子进程成为孤儿进程,此时init进程成为该进程的父进程,对进程资源进行回收。

僵尸进程

进程终止,父进程尚未回收,子进程残留资源(PCB)存放在内核中,变成僵尸进程(理论上所有进程都会经历僵尸态,因为进程的死亡与回收不同步)。
僵尸进程无法用kill命令清除,因为kill命令是用来终止进程的,而僵尸进程已经终止了。
清理僵尸进程的方法:
杀死其父进程,这个时候init进程就会对僵尸进程进行清理。

守护进程

daemon进程。通常运行与操作系统后台,脱离控制终端。一般不与用户直接交互。周期性的等待某个事件发生或周期性执行某一动作。
不受用户登录注销影响。通常采用以d结尾的命名方式。

守护进程创建步骤:

1. fork子进程,让父进程终止。

2. 子进程调用 setsid() 创建新会话

3. 通常根据需要,改变工作目录位置 chdir(), 防止目录被卸载。

4. 通常根据需要,重设umask文件权限掩码,影响新文件的创建权限。 

5. 通常根据需要,关闭/重定向 文件描述符

6. 守护进程 业务逻辑。

demo:创建守护进程

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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;
}

你可能感兴趣的:(Linux,linux,多进程)