linux学习第19、20天(父子进程)

article/2025/6/7 13:50:17

ps ajx -->查看pid,ppid,gid,sid

父子进程

父子进程相同:

                刚fork后,data段、text段、堆,栈、环境变量、全局变量、进程工作目录位置、信号处理方式

父子进程不同:

                进程id、返回值、各自的父进程、进程创建时间、闹钟、未决信号集

父子进程共享:

                读时共享、写时复制——全局变量

                1:文件描述符

                2:mmap映射区

gdb调试

注意要在fork前调试

设置父进程调式:set follow-fork-mode parent(默认也是)

设置子进程调试:set follow-fork-mode child

exec函数族

fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。

将当前进程的.text、.data替换为所要加载的程序的.text、.data,然后让进程从新的.text第一条指令开始执行,但进程ID不变,换核不换壳。

其实有六种以exec开头的函数,统称exec函数:

int execl(const char *path, const char *arg, ...);

int execlp(const char *file, const char *arg, ...);

int execle(const char *path, const char *arg, ..., char *const envp[]);

int execv(const char *path, char *const argv[]);

int execvp(const char *file, char *const argv[]);

int execve(const char *path, char *const argv[], char *const envp[]);

execlp函数

加载一个进程,借助PATH环境变量      

int execlp(const char *file, const char *arg, ...);              成功:无返回;失败:-1

    参数1:要加载的程序的名字。该函数需要配合PATH环境变量来使用,当PATH中所有目录搜索后没有参数1则出错返回。

    该函数通常用来调用系统程序。如:ls、date、cp、cat等命令。

可以看到,程序执行了ls -lh功能

execl函数

加载一个进程, 通过 路径+程序名 来加载。

    int execl(const char *path, const char *arg, ...);             成功:无返回;失败:-1

对比execlp,如加载"ls"命令带有-l,-F参数

execlp("ls", "ls", "-l", "-F", NULL);        使用程序名在PATH中搜索。

execl("/bin/ls", "ls", "-l", "-F", NULL);    使用参数1给出的绝对路径搜索。

用execl也能执行ls这些,把路径给出来就行,但是这样麻烦,所以对于系统指令一般还是用execlp

execvp函数

孤儿进程和僵尸进程

孤儿进程

        孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程领养孤儿进程。

僵尸进程

僵尸进程: 进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程。

注意:

        kill 对僵尸进程无效,只能杀死父进程结束僵尸进程。这里要注意,每个进程结束后都必然会经历僵尸态,时间长短的差别而已。

        子进程终止时,子进程残留资源PCB存放于内核中,PCB记录了进程结束原因,进程回收就是回收PCB。

wait回收子进程

wait函数

        一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。这个进程的父进程可以调用wait或waitpid获取这些信息,然后彻底清除掉这个进程。我们知道一个进程的退出状态可以在Shell中用特殊变量$?查看,因为Shell是它的父进程,当它终止时Shell调用wait或waitpid得到它的退出状态同时彻底清除掉这个进程。

 pid_t wait(int *status);      回收子进程退出资源,阻塞回收任意一个

       返回值:

                成功:清理掉的子进程pid;

                失败:-1 (没有子进程)

                status是传出参数

该函数有三个功能:

                ① 阻塞等待子进程退出

                ② 回收子进程残留pcb资源

                ③ 获取子进程结束状态(退出原因)。

        当进程终止时,操作系统的隐式回收机制会:

        1.关闭所有文件描述符

        2. 释放用户空间分配的内存。内核的PCB仍存在。其中保存该进程的退出状态。(正常终止→退出值;异常终止→终止信号)

        可使用wait函数传出参数status来保存进程的退出状态。借助宏函数来进一步判断进程终止的具体原因。宏函数可分为如下三组:

         1.  WIFEXITED(status) 为非0    → 进程正常结束

                WEXITSTATUS(status) 上宏为真,使用此宏 → 获取进程退出状态 (exit的参数)

         2. WIFSIGNALED(status) 为非0 → 进程异常终止

                WTERMSIG(status) 上宏为真,使用此宏 → 取得使进程终止的那个信号的编号。

        *3. WIFSTOPPED(status) 为非0 → 进程处于暂停状态

                WSTOPSIG(status) 上宏为真,使用此宏 → 取得使进程暂停的那个信号的编号。

                WIFCONTINUED(status) 为真 → 进程暂停后已经继续运行

获取子进程退出值和异常终止信号

正常情况

信号终止情况

waitpid函数

        pid_t waitpid(pid_t pid, int *status, int optains); 

        指定回收某一个进程,可以设置非阻塞

        参数:

                pid:指定回收的子进程pid

                        >0:待回收的的子进程pid

                        -1:任意子进程

                        0:同组子进程

                status:(传出)回收进程的状态

                optains:WNOHANG指定回收方式为非阻塞

        返回值:

                >0:表成功回收的子进程pid

                0:函数调用时,参3指定了WNOHANG,并且,没有子进程结束

                -1:失败,error

总结:

        wait、waitpid:一次调用,只回收一个子进程。

                                想回收多个。用while

例子(错误版)(这是因为,子进程里的pid和父进程里的pid不是一个pid,父进程里的pid还是0)

  1. //指定回收一个子进程错误示例  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4. #include <string.h>  
  5. #include <unistd.h>  
  6. #include <sys/wait.h>  
  7. #include <pthread.h>  
  8.   
  9. int main(int argc, char *argv[])  
  10. {  
  11.     int i;  
  12.     pid_t pid, wpid;  
  13.   
  14.     for (i = 0; i < 5; i++) {         
  15.         if (fork() == 0) {       // 循环期间子进程不 fork   
  16.             if (i == 2) {  
  17.                  pid = getpid();  
  18.                  printf("------pid = %d\n", pid);  
  19.             }  
  20.             break;  
  21.         }  
  22.     }  
  23.   
  24.     if (5 == i) {       // 父进程 表达式 2 跳出  
  25.         sleep(5);  
  26.   
  27.         //wait(NULL);                           // 一次wait/waitpid函数调用,只能回收一个子进程.  
  28.         //wpid = waitpid(-1, NULL, WNOHANG);    //回收任意子进程,没有结束的子进程,父进程直接返回  
  29.         //wpid = waitpid(pid, NULL, WNOHANG);   //指定一个进程回收  
  30.           
  31.         printf("------in parent , before waitpid, pid= %d\n", pid);  
  32.         wpid = waitpid(pid, NULL, 0);  //指定一个进程回收  
  33.         if (wpid == -1) {  
  34.             perror("waitpid error");  
  35.             exit(1);  
  36.         }  
  37.         printf("I'm parent, wait a child finish : %d \n", wpid);  
  38.   
  39.     } else {            // 子进程 break 跳出  
  40.         sleep(i);  
  41.         printf("I'm %dth child, pid= %d\n", i+1, getpid());  
  42.     }  
  43.   
  44.     return 0;  
  45. }  

代码运行如下,可以看到,传到父进程里的pid是0,但是

例子(正确版

注意:一个wait或者waitpid一次只能清理一个子进程,清理多个用循环。


http://www.hkcw.cn/article/AkwsEGhgsf.shtml

相关文章

AI写作革命:重塑创作未来

人工智能写作技术&#xff1a;革新创作方式的智能利器 人工智能写作技术&#xff08;AI写作技术&#xff09;是指利用自然语言处理&#xff08;NLP&#xff09;、机器学习&#xff08;ML&#xff09;等人工智能技术&#xff0c;辅助或自动化完成文本的创作、编辑与优化。这一技…

法律大语言模型(Legal LLM)技术架构

目录 摘要 1 法律AI大模型技术架构 1.1 核心架构分层 1.2 法律知识增强机制 2 关键技术突破与对比 2.1 法律专用组件创新 2.2 性能对比(合同审查场景) 3 开发部署实战指南 3.1 环境搭建流程 3.2 合同审查代码示例 4 行业应用与挑战 4.1 典型场景效能提升 4.2 关…

深入理解 C# Razor Pages:构建现代 Web 应用的利器

在现代 Web 开发中&#xff0c;选择合适的框架至关重要。ASP.NET Core 提供了多种开发模式&#xff0c;其中 Razor Pages 因其简单性、高效性和易用性&#xff0c;成为构建页面导向 Web 应用的首选方案。相比于传统的 MVC&#xff08;Model-View-Controller&#xff09;模式&am…

AgenticSeek 本地部署教程(Windows 系统)

#工作记录 Fosowl/agenticSeek&#xff1a;完全本地的 Manus AI。 部署排错参考资料在文末 或查找往期笔记。 AgenticSeek 本地部署教程&#xff08;Windows 系统&#xff09; 一、环境准备 1. 安装必备工具 Docker Desktop 下载地址&#xff1a;Docker Desktop 官网 安装后启…

后台管理系统八股

项⽬地址&#xff1a;https://github.com/Xiaodie-888/Frontend.git 前端 https://github.com/Xiaodie-888/backend.git 后端 技术栈&#xff1a;Vue3ViteTyprscriptPiniaElement-plusVue-RouterExpress.jsMySQL 核⼼⼯作与技术&#xff1a; 基础组件封装&#xff1a;基于 Ele…

014校园管理系统技术解析:构建智慧校园管理平台

校园管理系统技术解析&#xff1a;构建智慧校园管理平台 在教育信息化快速发展的当下&#xff0c;校园管理系统成为提升学校管理效率、优化校园服务的重要工具。该系统集成院校管理、投票管理等多个核心模块&#xff0c;面向管理员、用户和院内管理员三种角色&#xff0c;通过…

SpringBoot2.3.1集成Knife4j接口文档

首先要查看项目中pom文件里面有没有swagger和knife4j的依赖&#xff0c;如果有的话删除&#xff0c;加入以下依赖 <!-- swagger --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-spring-boot-starter</…

Abaqus/CAE操作介面

Abaqus/CAE操作介面: • 完全整合建模、分 析、工作管理與結 果評估。 • 對於Abaqus的各系 統&#xff0c;提供最完善的 介面。 • 使用中立的資料庫 檔案&#xff0c;獨立於硬體 設備。 • 客製化&#xff0c;成為應用 於特定問題之系統 。 • 選 單 (menu) 、圖 標 (ico…

垂起固定翼无人机应用及技术分析

一、主要应用行业 1. 能源基础设施巡检 电力巡检&#xff1a;适用于超高压输电线路通道的快速巡查&#xff0c;实时回传数据提升智能运检效率。 油田管道监测&#xff1a;利用长航时特性&#xff08;1.5-2小时&#xff09;对大范围管道进行隐患排查&#xff0c;减少人力巡…

DPDK与网络协议栈

DPDK与网络协议栈 DPDK简介实现使用DPDK收发数据通过UDP收发数据通过 TCP 收发数据 DPDK简介 DPDK 是是 Intel 提供的数据平面开发工具集&#xff0c;为&#xff08;IA&#xff09;处理器架构下用户高效的数据包处理提供函数以及驱动支持&#xff0c;不同于 Linux 下是以通用性…

51c大模型~合集134

我自己的原文哦~ https://blog.51cto.com/whaosoft/13956141 #Foveated Instance Segmentation 解决XR算力瓶颈&#xff0c;FovealSeg框架实现毫秒级IOI分割 本文共同第一作者为纽约大学研究生 Hongyi Zeng 和Wenxuan Liu。合作作者为 Tianhua Xia、Jinhui Chen、Ziyun…

基于51单片机和8X8点阵屏、独立按键的填充消除类小游戏

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、8X8点阵屏2、独立按键3、定时器04、定时器1 四、主函数总结 系列文章目录 前言 使用的是普中A2开发板。 【单片机】STC89C52RC 【频率】12T11.0592MHz 【外设】8X8点阵屏、独立按键 效果查看/操作演示&#x…

openharmony5.0.0中kernel子系统编译构建流程概览(rk3568)

概述 在梳理openharmony对linux内核做了哪些更改时&#xff0c;简单梳理了下kernel部分的编译构建流程&#xff0c;并根据源码做了简单论证。分享出来&#xff0c;希望对大家有所帮助。 系统版本:openharmony5.0.0 开发板:dayu200 编译环境:ubuntu22 执行流程 在kernel\l…

web攻防之SSTI 注入漏洞

知识简介 &#xff1a; 模版引擎和框架的区别 ssti的中文翻译 &#xff1a; 服务端的模版的注入 模版引擎 &#xff1a;前端的用于装饰优化html的模版 最简单的就是在腾讯会议中的聊天功能 框架 &#xff1a; 这个是一套独立存在的逻辑 如TP他是一个区别于php语法的后端逻辑…

【Linux】Linux 进程基础

参考博客&#xff1a;https://blog.csdn.net/sjsjnsjnn/article/details/125533127 进程 1.基本概念 课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等内核观点&#xff1a;担当分配系统资源&#xff08;CPU时间&#xff0c;内存&#xff09;的实体。 …

win32相关(内存映射文件)

内存映射文件 什么是内存映射文件 内存映射文件是一种将磁盘文件直接映射到进程地址空间的技术&#xff0c;允许应用程序像访问内存一样访问文件内容。这种机制提供了高效的文件I/O操作方法 #include<windows.h> #include<iostream>HANDLE hFile; HANDLE hMapFile;…

前端​​HTML contenteditable 属性使用指南

​​什么是 contenteditable&#xff1f; HTML5 提供的全局属性&#xff0c;使元素内容可编辑类似于简易富文本编辑器兼容性​​ 支持所有现代浏览器&#xff08;Chrome、Firefox、Safari、Edge&#xff09; 移动端&#xff08;iOS/Android&#xff09;部分键盘行为需测试 &l…

极智项目 | 基于PyQT实现的YOLOv12行人目标检测软件设计

基于YOLOv12的专业级行人目标检测软件应用 开发者: 极智视界 软件下载&#xff1a;链接 &#x1f31f; 项目特色 专业检测: 基于最新YOLOv12模型&#xff0c;专门针对行人检测优化现代界面: 采用PyQt5构建的美观、直观的图形用户界面高性能: 支持GPU加速&#xff0c;检测速…

[yolov11改进系列]基于yolov11引入可变形注意力DAttention的python源码+训练源码

【DAttention介绍】 DAT全称为Deformable Attention Transformer&#xff0c;其作用在于通过可变形注意力机制&#xff0c;同时包含了数据依赖的注意力模式&#xff0c;克服了常见注意力方法存在的内存计算成本高、受无关区域影响以及数据不可知等问题。相比一些只提供固定注意…

谷歌地图2022高清卫星地图手机版v10.38.2 安卓版 - 前端工具导航

谷歌地图2022高清卫星地图手机版是由谷歌公司推出的一款非常好用的手机地图服务软件&#xff0c;用户能够通过精准的导航和定位来查看地图&#xff0c;周边的商店等生活服务都会在地图上显示&#xff0c;用起来超级方便。 谷歌卫星高清地图 下载链接&#xff1a;夸克网盘分享 …