【Linux】孤儿进程(第十二篇)

目录

孤儿进程

定义

产生原因

处理机制

特性与影响

示例

守护进程(daemon)

定义:

特点:

与孤儿进程的区别:


孤儿进程

孤儿进程是操作系统中的一个概念,主要出现在类UNIX操作系统中。以下是关于孤儿进程的详细解释:

定义

孤儿进程指的是在其父进程执行完成或被终止后,仍继续运行的一类进程。这些进程由于失去了父进程的监控和管理,因此被称为“孤儿”。

产生原因

在类UNIX操作系统中,子进程是通过父进程创建的。当一个父进程由于正常完成工作而退出或由于其他情况(如异常终止)被终止时,如果它的一个或多个子进程还在运行,那么这些子进程就会成为孤儿进程。

处理机制

为避免孤儿进程退出时无法释放所占用的资源而僵死,系统会将这些孤儿进程交由init进程(进程号为1)来收养。init进程是系统启动时创建的第一个进程,负责系统的初始化和启动其他系统进程。当init进程收养了一个孤儿进程后,它会成为该孤儿进程的父进程,并负责对该孤儿进程进行状态收集和资源释放等工作。

特性与影响

  • 无父进程:孤儿进程没有父进程,其父进程ID(PPID)会被设置为init进程的PID,通常为1。
  • 资源释放:由于init进程会负责孤儿进程的资源释放工作,因此孤儿进程本身并不会对系统造成资源泄露等危害。
  • 系统稳定性:孤儿进程的存在是系统正常运作的一部分,它们通过init进程的收养和管理,保证了系统的稳定性和资源的有效利用。

示例

以下是一个简单的示例程序,用于演示孤儿进程的产生和处理:

#include  
#include  
#include  
#include  


int main() { 
pid_t fpid; 
fpid = fork(); 
if (fpid == -1) { 
printf("fork error.\n"); 
exit(1); 
} else if (fpid == 0) { // 子进程 
printf("I'm child process, child pid = %d, parent pid = %d\n", getpid(), getppid()); 
sleep(5); // 睡眠5秒,保证父进程退出 
printf("I'm sleep. child pid = %d, parent pid = %d\n", getpid(), getppid()); 
printf("child process is done.\n"); 
} else { // 父进程 
printf("I'm parent process.\n"); 
sleep(1); // 睡眠1秒,然后退出 
printf("parent process is done. Exiting...\n"); 
exit(0); // 父进程退出,子进程成为孤儿进程 
} 
return 0; 
}

在这个示例中,父进程创建了一个子进程后,自己先退出。此时,子进程成为孤儿进程,并被init进程收养。通过打印子进程的父进程ID(PPID),可以看到它变成了init进程的PID(通常为1)。

综上所述,孤儿进程是操作系统中一种正常的现象,它们通过init进程的收养和管理,保证了系统的稳定性和资源的有效利用。

守护进程(daemon)

定义

  • 守护进程(Daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。它们通常与终端无关,并且在系统启动时自动运行,直到系统关闭。

特点

  • 守护进程是脱离控制终端的,在后台运行,不受用户登录和注销的影响。
  • 它们通常执行一些系统级的任务,如日志记录、网络服务等。
  • 守护进程可以由系统管理员根据需要启动或停止。
#include
#include
#include
#include
#include 
#include 
#include 
#include 
#include 
​
​
int main(){
    pid_t pid;
​
    pid = fork();
​
    if(pid < 0){
        perror("fork");
        return 0;
    }
​
    if(pid > 0){
        exit(0);
    }
​
    pid = setsid();
​
    chdir("/tmp");//改变目录
​
    umask(0); //它的意思就是0取反再创建文件时权限相与.这样就是给后面的代码调用函数mkdir给出最大的权限,避免了创建目录或文件的权限不确定性。
​
    int i;
    FILE *fd;
    time_t t;
    for(i = 0;i < 3;i++){    //我们一般把守护进程的标准输入、标准输出重定向到空设备(黑洞)或者关闭,从而确保守护进程不从键盘接收任何东西,也不把输出结果打印到屏幕。
        close(i);
    }
​

​
    int fd = open("log.txt",O_WRONLY|O_CREAT,0644);
    time_t t;
    while(1){
        t = time(NULL);
        dprintf(fd,"%s\n",ctime(&t));
        fsync(fd);
        sleep(3);
    }
}
​

与孤儿进程的区别

  • 产生方式:守护进程是特意创建的,用于执行特定的系统任务;而孤儿进程是由于父进程退出而意外产生的。
  • 目的与功能:守护进程的主要目的是在系统后台执行长期运行的任务;而孤儿进程本身并没有特定的目的或功能,它们只是由于父进程的退出而失去了管理。
  • 处理方式:守护进程通常有自己的管理方式和退出机制;而孤儿进程则依赖于init进程进行管理和资源释放。

综上所述,孤儿进程与守护进程在操作系统中扮演着不同的角色,它们之间的主要区别在于产生方式、目的与功能以及处理方式等方面。

你可能感兴趣的:(Linux,linux,microsoft,运维)