首页 > 系统相关 >【Linux】孤儿进程(第十二篇)

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

时间:2024-09-04 15:22:08浏览次数:13  
标签:第十二 pid 孤儿 init Linux 进程 include 守护

目录

孤儿进程

定义

产生原因

处理机制

特性与影响

示例

守护进程(daemon)

定义:

特点:

与孤儿进程的区别:


孤儿进程

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

定义

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

产生原因

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

处理机制

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

特性与影响

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

示例

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

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/wait.h> 


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<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
​
​
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进程进行管理和资源释放。

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

标签:第十二,pid,孤儿,init,Linux,进程,include,守护
From: https://blog.csdn.net/abclui/article/details/141884359

相关文章

  • MYSQL-Linux安装
    MySQL8.0.26-Linux版安装1.准备一台Linux服务器云服务器或者虚拟机都可以;Linux的版本为Centos7;2.下载Linux版MySQL安装包https://downloads.mysql.com/archives/community3.创建目录、解压mkdirmysq1//创建目录tar-xvfmysql安装包.x8664.rpm-bundle.tar-Cmysql/......
  • Linux keepalive
    安装1,安装 https://www.cnblogs.com/lfxx/p/17876757.htmlhttps://www.cnblogs.com/wangchengshi/p/10912177.html 2,linuxkeepalived日志,如何重定向Keepalived日志的输出路径https://blog.csdn.net/weixin_39935571/article/details/116731816https://www.......
  • Linux之curl详解
    curl是一个非常强大的命令行工具,用于发送和接收数据,支持多种协议,如HTTP、HTTPS、FTP等。它被广泛用于测试、调试Web接口以及自动化脚本中。下面是对curl的详细解释,包括其基本用法和一些高级特性。基本用法发送HTTPGET请求bashcurlhttp://example.com这个命令会......
  • 轻松上手 | 基于RockyLinux 9.4安装部署Zabbix 7.0
    作者乐维社区(forum.lwops.cn)许远2024年6月30日,CentOS停止更新和维护,不少企业用户开始寻求新的替代方案。RockyLinux,一个开源、社区拥有和管理、免费的企业Linux发行版,提供强大的生产级平台,可作为CentOS停止维护(改为滚动更新的Stream版)后,RHEL的下游Linux操作系统替代方案,并继......
  • Linux基础入门 --5 DAY
    移动和重命名文件    mv命令可以实现文件或目录的移动或改名    同一分区移动数据,速度快:数据位置未变化    不同分区移动数据,速度相对较慢,数据位置发生了变化    格式:mv[OPTION]...[-T] SOURCE DESTmv[OPTION]...SOURCE...DIRE......
  • Linux下makefile 编译项目
    1、规划makefile编写a、根目录下放三个文件:1、makefile:是咱们编译项目的入口脚本,编译项目从这里开始,起总体控制作用。2、config.mk:配置脚本,被makefile包含,单独分处理,为了应付一些可变的东西。3、common.mk:最核心的编译脚本,定义makefile编译规则,并且各个子目录中都用到这个来编译.......
  • Linux C++ 多线程高并发服务器实战项目一
    1、项目介绍1、按照包头+包体的格式收发数据包,解决粘包的问题2、非常完整的多线程高并发服务器3、根据收到数据包执行,不同的业务逻辑函数用到的技术:epoll高并发通讯技术,用的是水平触发【LT】水平触发模式通过线程池技术处理业务逻辑多线程、之间同步技术使用,互斥量、和条件变......
  • linux下graphviz离线安装指南及报错解决方式
    在联网的机器上下载Graphviz的源码包:网址:Graphviz下载地址将下载的安装包copy到linux下,解压后,在解压目录下执行安装tar-xvfgraphviz-12.1.0.tar.gzcdgraphviz-12.1.0./configure--prefix=/your_want_install_path/makemakeinstall注:我在执行make命令时报......
  • 在Linux系统中如何修改只读文件?
    在Linux操作系统中,每个文件都有自己的权限,包括读取、写入和执行权限。只读权限是指用户只能查看文件内容而不能修改或删除文件的权限,那么Linux只读文件如何修改?以下是具体方法。在Linux系统中,默认情况下某些文件和目录是只读的,这意味着您无法直接更改它们的内容。然而,可以......
  • nginx部署前端项目 (Linux版)
    目录一:nginx部署前端项目(Windows版)二:下载相关依赖三:下载安装nginx四:启动nginx五:部署前端项目一:nginx部署前端项目(Windows版)nginx部署前端项目(Windows版本)二:下载相关依赖yuminstall-ygcc-c++pcrepcre-develzlibzlib-developensslopen......