Linux-----进程处理(waitpid,进程树,孤儿进程)

news/2025/1/9 15:58:24 标签: linux, 算法, 运维

目录

waitpid等待

进程树

孤儿进程


waitpid等待

 Linux中父进程除了可以启动子进程,还要负责回收子进程的状态。如果子进程结束后父进程没有正常回收,那么子进程就会变成一个僵尸进程——即程序执行完成,但是进程没有完全结束,其内核中PCB结构体(下文介绍)没有释放。在上面的例子中,父进程在子进程结束前就结束了,那么其子进程的回收工作就交给了父进程的父进程的父进程

#include <sys/types.h>
#include <sys/wait.h>

/** 等待子进程的终止并获取子进程的退出状态
*    功能简单 没有选择
*/
pid_t wait(int *wstatus);
/**
 * 功能灵活 可以设置不同的模式 可以等待特定的子进程
 * 
 * pid: 等待的模式
 *      (1) 小于-1 例如 -1 * pgid,则等待进程组ID等于pgid的所有进程终止
 *      (2) 等于-1 会等待任何子进程终止,并返回最先终止的那个子进程的进程ID -> 儿孙都算
 *      (3) 等于0 等待同一进程组中任何子进程终止(但不包括组领导进程) -> 只算儿子
 *      (4) 大于0 仅等待指定进程ID的子进程终止
 * wstatus: 整数指针,子进程返回的状态码会保存到该int
 * options: 选项的值是以下常量之一或多个的按位或(OR)运算的结果;二进制对应选项,可多选:
 *      (1) WNOHANG 如果没有子进程终止,也立即返回;用于查看子进程状态而非等待
 *      (2) WUNTRACED 收到子进程处于收到信号停止的状态,也返回。
 *      (3) WCONTINUED(自Linux 2.6.10起)如果通过发送SIGCONT信号恢复了一个已停止的子进程,则也返回。
 * return: (1) 成功等到子进程停止 返回pid
 *         (2) 没等到并且没有设置WNOHANG 一直等
 *         (3) 没等到设置WNOHANG 返回0
 *         (4) 出错返回-1
 */
pid_t waitpid(pid_t pid, int *wstatus, int options);

/*
    更加全面的子进程监控和状态报告
*/
int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);

示例: 

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

int main(int argc, char const* argv[])
{

    int state;//子进程的状态

    printf("当前父进程%d\n", getpid());

    __pid_t pid = fork();
    // __pid_t son_pid = fork();

    if (pid < 0) {
        perror("fork");
        return -1;
    }
    else if (pid == 0) {
        char* args[] = { "/usr/bin/ping","-c" ,"50","baidu.com",NULL };
        char* envs[] = { NULL };
        printf("子进程%d,执行ping\n",getpid());
        int re = execve(args[0], args, envs);
        if (re < 0) {
            perror("execve");
            return -1;
        }
    }
    else {
        printf("父进程%d等待子进程%d\n", getpid(), pid);
        waitpid(pid, &state, 0);
    }
    printf("执行完成\n");

    return 0;
}

进程树

实质上,1号进程就是systemd,它由内核创建,是第一个进程,负责初始化系统,启动其他所有用户空间的服务和进程。它是所有进程的祖先。

在ps -ef的输出结果中,我们发现,CMD部分有的行带有[],而有的没有,前者属于内核线程,内核线程在内核空间执行,不占用任何用户空间资源,它们在技术上是线程,而在许多方面表现得像独立的进程,因此也会被ps命令检索到。第一个内核线程的pid为2,它是所有其它内核线程的祖先。

  1. pstree -p查看进程树

孤儿进程

孤儿进程(Orphan Process)是指父进程已结束或终止,而它仍在运行的进程。

当父进程结束之前没有等待子进程结束,且父进程先于子进程结束时,那么子进程就会变成孤儿进程。

我们可以得出结论:孤儿进程会被其祖先自动领养。此时的子进程因为和终端切断了联系,所以很难再进行标准输入使其停止了,所以写代码的时候一定要注意避免出现孤儿进程。


http://www.niftyadmin.cn/n/5817701.html

相关文章

Ollama私有化部署大语言模型LLM(上)

目录 一、Ollama介绍 二、安装Ollama 1、标准安装 2、国内加速 三、升级Ollama版本 四、使用Ollama 1、启动ollama服务 systemctl start ollama.service ollama serve 2、使用ollama命令 ollama run 运行模型 ollama ps 查看正在运行的模型 ollama list 查看已有(已…

什么是Spring Boot?深度解析其核心概念与优势

引言 在Java开发领域&#xff0c;Spring框架一直以其强大的功能和灵活性著称&#xff0c;然而&#xff0c;其复杂的配置和庞大的学习曲线也常常让开发者望而却步。Spring Boot的出现&#xff0c;正是为了解决这些问题&#xff0c;提供了简化Spring应用开发的解决方案。本文将深…

vscode-github个人使用记录

前言&#xff1a; 记录用vscode和github的过程&#xff0c;只有用过才会印象深刻&#xff0c;因此只记录使用过命令或者配置。 一、配置vscode和git 首先是配置vscode&#xff0c;每什么好说的&#xff0c;vscode原声支持github&#xff0c;直接ChtlShiftG&#xff0c;或者是…

Tesseract5.4.0自定义LSTM训练

准备jTessBoxEditor&#xff0c;然后配置环境变量。 1、将图片转换成tif格式的&#xff0c;这里需要用画图工具另存为&#xff1b; 2、生成box文件 执行命令&#xff1a; tesseract agv.normal.exp1.tif agv.normal.exp1 -l eng --psm 6 batch.nochop makebox 关于box文件…

Java验证邮箱是否有用的实现与解析

在现代互联网应用中&#xff0c;邮箱验证是一个常见的需求。通过邮箱验证&#xff0c;开发者可以确保用户提供的邮箱地址是有效的&#xff0c;从而在后续的操作中&#xff0c;如密码重置、通知发送等&#xff0c;依赖这些有效的邮箱地址。本文将详细介绍如何使用Java实现邮箱验…

Vue演练场基础知识(六)Props传参+Emits事件

为学习Vue基础知识&#xff0c;我动手操作通关了Vue演练场&#xff0c;该演练场教程的目标是快速体验使用 Vue 是什么感受&#xff0c;设置偏好时我选的是选项式 单文件组件。以下是我结合深入指南写的总结笔记&#xff0c;希望对Vue初学者有所帮助。 文章目录 十三. Props传…

设计模式-结构型-桥接模式

1. 什么是桥接模式&#xff1f; 桥接模式&#xff08;Bridge Pattern&#xff09; 是一种结构型设计模式&#xff0c;它旨在将抽象部分与实现部分分离&#xff0c;使它们可以独立变化。通过这种方式&#xff0c;系统可以在抽象和实现两方面进行扩展&#xff0c;而无需相互影响…

vite5.x配置https

旧版的vite直接在config里面配置https&#xff1a;true即可&#xff0c;新版的麻烦一些。 1.准备工作 需要安装openssl 下载地址&#xff1a;Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 找到合适的版本安装&#xff0c;配置好环境变量&#x…