进程描述+PCB+fork用法介绍

news2025/1/11 5:41:52

进程控制块PCB

  1. 进程id:系统中每个进程有唯一的id,在c语言中用pid_t 表示,其实就是非负整数
  2. 进程的状态:就绪,运行,挂起,停止,僵尸等状态
  3. 进程切换是需要保存和恢复的一些cpu寄存器
  4. 描述虚拟地址空间的信息
  5. 描述控制终端的信息
  6. 当前工作目录
  7. umask掩码
  8. 文件描述符表,包含很多指向file 结构体的指针
  9. 信号相关信息
  10. 用户id和组id
  11. 控制终端,session和进程组
  12. 进程可以使用的资源上限

进程控制fork

fork的作用是根据一个现有的进程辅助出一个新进程,原来的进程称为父进程,新进程称为子进程。系统中同时运行着很多的进程,这些进程都是从最初只有一个进程开始一个一个复制出来的。

在shell下输入命令可以运行一个程序,是因为shell进程在读取用户输入的命令之后会调用fork复制出一个新的shell进程。

fork 代码实例

int main() {
    std::string msg;
    int n;
    pid_t pid = fork();
    if(pid < 0){
        perror("fork");
        exit(1);
    }
    if(pid == 0){
        // 子进程
        msg = "child process~\n";
        n = 6;
    }else{
        // 父进程
        msg = "parent process~\n";
        n = 3;
    }
    while (n> 0){
        std::cout << msg;
        sleep(1);
        n--;
    }
    return 0;
}

上面程序,当pid == 0 时,就是子进程执行逻辑,不等于0的时候就是父进程的代码执行逻辑。

上面的小程序运行结果是:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sBQoTOnI-1686839557283)(null)]

可以发现上面的结果中有bash 进程的参与。这是因为父进程在3s后就死掉了,然后子进程就成了孤儿进程。他会给另一个进程去托管。其实上面的进程关系是bash->parent->child 。当parent死掉后,bash进程作为他的父进程会恢复自己的状态 。我们再将程序改动一下,打印一下,各个进程的pid,来看看最后作为孤儿进程的child process 被哪个进程托管了。

getPid + getPPid

int main() {
    std::string msg;
    int n;
    pid_t pid = fork();
    if(pid < 0){
        perror("fork");
        exit(1);
    }
    if(pid == 0){
        // 子进程
        n = 6;
        while(n > 0){
            std::cout << "self child pid = " << getpid() << "parent pid = " << getppid() << std::endl;
            sleep(1);
            n--;
        }
    }else{
        // 父进程
        n = 3;
        while(n > 0){
            std::cout << "self parent pid = " << getpid() << "parent pid = " << getppid() << std::endl;
            sleep(1);
            n --;
        }

    }
    return 0;
}

image-20230517133308327

上面的结果可以看出 后面的孤儿进程 被 pid 为 1的系统的第一个进程给接管了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/651757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微调Hugging Face中图像分类模型

前言 本文主要针对Hugging Face平台中的图像分类模型&#xff0c;在自己数据集上进行微调&#xff0c;预训练模型为Google的vit-base-patch16-224模型&#xff0c;模型简介页面。代码运行于kaggle平台上&#xff0c;使用平台免费GPU&#xff0c;型号P100&#xff0c;笔记本地址…

【惯性导航】隧道、高架桥、高楼林立弱信号环境室外定位_惯导模块

汽车行驶在路上&#xff0c;视野可能会受到周边的树木、同行的卡车、城市楼群的遮挡&#xff0c;卫星导航系统容易受到周围环境的影响&#xff0c;例如树木楼房等&#xff0c;造成多路径效应&#xff0c;使得定位结果精度降低甚至丢失&#xff0c;尤其是在隧道或者室内环境中&a…

树莓派开Samba协议和Windows电脑共享资料

文章目录 1. 前言2. 树莓派安装和配置Samba2.1. 更新源2.2. 安装Samba软件2.3. 修改Samba配置文件2.4. 重启Samba服务2.5. 添加用户到Samba 3. Windows访问共享目录3.1. 查看树莓派的地址3.2. 打开这个IP地址 4. 报错4.1. 用户名或者密码不正确 1. 前言 虽然出门派很方便&…

C++算法————二分查找

又是鸽了三千万年 马上要打csp了&#xff0c;开始回流学j组的知识了&#xff0c;浅说一下二分吧&#xff08;&#xff09; --------------------------------------------------------------------------------------------------------------------------------- 二分查找 …

tsx写法

1.安装插件 npm install vitejs/plugin-vue-jsx -D vite.config.ts 配置 import { defineConfig } from vite import vue from vitejs/plugin-vue import vueJsx from vitejs/plugin-vue-jsx; // https://vitejs.dev/config/ export default defineConfig({plugins: [vue(),v…

TC15WProteus仿真DS18B20温度采集报警控制系统STC15W4K32S4

STC15WProteus仿真DS18B20温度采集报警控制系统STC15W4K32S4 Proteus仿真小实验&#xff1a; STC15WProteus仿真DS18B20温度采集报警控制系统STC15W4K32S4 功能&#xff1a; 硬件组成&#xff1a;STC15W4K32S4单片机 LCD1602显示器DS18B20温度传感器蜂鸣器 1.单片机读取DS18…

数据链路层(MAC)、网络层(IP)、传输层(TCP/UDP)抓包分析

目录 OSI七层模型数据包逐层封装头部抓包分析数据包概况数据链路层抓包网络层抓包&#xff08;IP协议抓包&#xff09;UDP抓包数据负载抓包 Linux cooked-mode capture OSI七层模型 OSI模型&#xff08;OSI model&#xff09;&#xff0c;开放式系统互联通信参考模型&#xff…

【读书笔记】《小王子》- [法] 安托万•德•圣埃克苏佩里 / [法国] 安东尼·德·圣-埃克苏佩里

文章目录 Chapter 01Chapter 02Chapter 03Chapter 04Chapter 05Chapter 06Chapter 07Chapter 08Chapter 09 Chapter 01 Chapter 02 “因为我住的地方非常小…” 想起了陀思妥耶夫斯基书中的一句话&#xff0c;“要爱具体的人&#xff0c;不要爱抽象的人&#xff1b;要爱生活本…

给开发者的ChatGPT提示词工程指南

ChatGPT Prompt Engineering for Development 基本大语言模型和指令精调大语言模型的区别&#xff1a; 指令精调大语言模型经过遵从指令的训练&#xff0c;即通过RLHF&#xff08;基于人类反馈的强化学习&#xff09;方式在指令上精调过&#xff0c;因而更加有帮助&#xff0…

OverLeaf(LaTeX在线编辑器)制作项目周报

目录 注册及登录 1、登录官网 2、设置语言 制作周报 1、新建项目 2、整体预览 3、分段解析 3.1 页面大小/页边距 3.2 页眉页脚 3.3 标题样式 3.4 内容分栏显示 3.5 调整行间距 3.6 插入图片 3.7 图片和文字排版 3.8 分页 3.9 标题和内容 4、编译和导出 4.1 编…

hutool poi、apache poi实现导入导出以及解析excel

一、前言 看了例子之后后续需要更加深入学习或者更多理解其他API的话&#xff0c;建议看官方文档。hutool项目是中国人维护的&#xff0c;有中文文档&#xff0c;阅读起来很方便。apache poi比较底层一点&#xff0c;可以更加自由去二次开发自己所需的功能。 hutool官方文档 …

zkML零知识机器学习介绍

1. 引言 零知识证明技术的2大基石为&#xff1a; 1&#xff09;succinctness&#xff1a;相比于直接运行整个计算本身&#xff0c;验证该计算完整性证明要简单很多。2&#xff09;zero-knowledge&#xff1a;可在不泄露计算隐私的情况下&#xff0c;证明计算的完整性。 生成…

【Java入门】-- Java基础详解之 [数组、冒泡排序]

目录 1.为什么需要数组&#xff1f; 2.数组的介绍 3.数组的快速入门 4.数组的使用 5.动态初始化 6.静态初始化 7.数组的细节 8.数组的赋值机制 9.数组拷贝 10.数组反转 11.二维数组 12.冒泡排序 1.为什么需要数组&#xff1f; 有五个学生&#xff0c;他们英语成绩…

探索不同学习率对训练精度和Loss的影响

验证精度、验证Loss的影响 1 问题 在探索mnist数据集过程中&#xff0c;学习率的不同&#xff0c;对我们的实验结果&#xff0c;各种参数数值的改变有何变化&#xff0c;有何不同。 学习率对精度和损失的影响研究。训练周期100学习率 [0.1, 0.01, 0.001, 0.0001](1) 不同学习率…

蓝牙网关Gateway_数据采集,连接控制,室内定位VDB2602

蓝牙网关&#xff0c;内部集成了WiFi、蓝牙、4G等多种无线通信方式&#xff0c;因此也继承了蓝牙、WiFi的有扫描功能、连接功能、数据透传功能&#xff0c;被应用于智能家居的各种场景中&#xff0c;例如&#xff1a;远程控制BLE装置&#xff0c;接收BLE设备发送的数据&#xf…

线程的创建和使用(一)

1、线程 1.1、线程的概念 一个线程就是一个 "执行流". 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 "同时" 执行着多份代码. 1.2、创建线程 方法一&#xff1a;继承Thread类 public class Exe_01 {public static void main(String[] args…

pandas与pyspark计算效率对比

日常工作中&#xff0c;主要还是应用HQL和SparkSQL&#xff0c;数据量大&#xff0c;分布式计算很快&#xff1b; 本地数据处理&#xff0c;一般会使用python的pandas包&#xff0c;api丰富&#xff0c;写法比较简单&#xff0c;但只能利用单核性能跑数&#xff0c;数据量大可…

【MySQL入门】-- 数据库简单的SELECT语句详解

目录 1.SQL分类 2.注释 3.数据导入指令 4.基本的SELECT语句 5.列的别名 6.去重复行 7.显示表结构 8.一些数据库基本操作 1.SQL分类 SQL语言在功能上主要分为三大类&#xff1a; DDL(Data Defintion Language)数据定义语言&#xff1a;定义不同的数据库&#xff0c;表…

【C#】并行编程实战:任务并行性(中)

本章继续介绍任务并行性&#xff0c;因篇幅所限&#xff0c;本章为中篇。 4、取消任务 .NET Framework 提供了以下两个类来支持任务取消&#xff1a; CancellationTokenSource &#xff1a;此类负责创建取消令牌&#xff0c;并将取消请求传递给通过源创建的所有令牌。 Cancell…

关于xinput1_3.dll丢失的详细解决方法

xinput1_3.dll是电脑文件中的dll文件&#xff08;动态链接库文件&#xff09;。如果计算机中丢失了某个dll文件&#xff0c;可能会导致某些软件和游戏等程序无法正常启动运行&#xff0c;并且导致电脑系统弹窗报错。 在我们打开软件或者游戏的时候&#xff0c;电脑提示xinput1_…