Linux进程概念(一)

文章目录

  • Linux进程概念
    • 查看进程
    • 杀死进程
    • 进程标识符
  • 手动创建进程的方式
    • fork函数创建进程
  • 进程状态
    • 运行态
    • 阻塞态和挂起


Linux进程概念

前文我们了解了,进程的基本概念,在课本上被描述为,正在执行的程序,在linux内核上,认为进程是担当分配系统资源(CPU时间,内存)的实体。

进程=内核描述数据结构(PCB)+代码和数据

在Linux中,PCB为task_struct,它会被装载到RAM(内存)里并且包含着进程的信息。

本文我们主要是了解进程的部分概念。

查看进程

查看进程的方式有很多种,前文我们介绍了在/proc 系统文件中查看,在该文件目录下,进程就是一个又有一个数字目录。

在这里插入图片描述

ps的使用

语法:ps ajx 可以查看当前所有进程

ps ajx | grep 程序/文件名 来查看程序/文件的进程信息

在这里插入图片描述

解释:

ps ajx | grep proc 可以在所有进程信息中,查找到proc的进程信息

ps ajx | head -1 表示将进程的属性的描述信息显示

ps ajx | head -1 && ps ajx | grep proc 显示进程proc的相关信息,并带上进程属性的描述

ps ajx | head -1 && ps ajx | grep proc | grep -v grep 不显示grep的进程信息

&&可以用分号代替,使得两条指令能一起执行,将执行的结果一并展示出来。

杀死进程

语法:kill -9 PID

向执行的PID进程发送9号信号,正在运行的PID进程显示killed,被杀死
在这里插入图片描述

进程标识符

PID:进程ID

PPID:父进程ID

获取标识符的方式:getpid()、getppid()

在这里插入图片描述

注意:getpid()和getppid()都是系统调用函数,来通过该函数来访问操作系统,得到自己的进程信息,重新运行程序子进程的PID会发生变化,但是父进程ID不会发生变化。

bash是所有程序的父进程,将其他程序作为其的子进程,子只有一个父,但是父可有多个子

手动创建进程的方式

我们知道两种创建进程的方式,第一种就是./proc执行程序,以此来创建进程,第二种,使用fork函数来创建进程。

创建进程的方式,有以下两种

  • ./运行程序 指令级别
  • fork函数 代码级别

fork函数创建进程

fork函数用来创建子进程。

两种结果

  • 成功创建子进程,子进程返回0,父进程返回的是子进程的PID
  • 创建失败,父进程返回-1

在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
    
    printf("这是一个进程,PID为:%d,PPID为:%d\n",getpid(),getppid());
    sleep(1);
    //fork()创建子进程
    pid_t id =fork();
    
    if(id == 0)
    {
        //表示子进程
        while(1)
        {
            printf("子进程,PID为:%d,PPID为:%d\n",getpid(),getppid());
            sleep(1);
        }
    }
    else if(id > 0)
    {
        //父进程,PID是一个非负数
        while(1)
        {
            printf("父进程, PID为:%d,PPId为:%d\n",getpid(),getppid());
            sleep(1);
        }
    }
    else{
        //创建子进程失败
        printf("创建子进程失败\n");
    }
    return 0;
}

问题:

  1. 为什么fork要给子进程返回0,给父进程返回子进程的PID?
  2. 一个函数是如何做到返回两次的?如何理解?
  3. 一个变量怎么会有不同的内容?如何理解?
  4. fork函数到底在干什么?干了什么?
  5. 进程调用的顺序
  6. bash是如何创建的,以及与fork的关系

为什么fork要给子进程返回0,给父进程返回子进程的PID?

在这里插入图片描述

总结:返回不同的返回值,是为了区分父子进程,使得执行不同的代码块

一个函数是如何做到返回两次的?如何理解?
在这里插入图片描述

两个返回值的实现依赖于,在创建子进程之后,父子进程共享代码

一个变量怎么会有不同的内容?如何理解?

在这里插入图片描述

在任何平台,进程在运行的时候,都是具有独立性的,子进程是和父进程开始指向同一数据的,但是如果子进程修改某一数据,就会发生写时拷贝,指向开辟的空间。

fork函数到底在干什么?干了什么?
在这里插入图片描述

fork函数就是创建子进程,然后根据进程的不同返回不同的数据。

进程调用的顺序

调度器:是一种执行选取进程的算法,决定选取哪一个进程放在CPU上执行。

父子进程创建完毕之后,谁先运行是由调度器来决定的,所以不知道谁先被执行

bash是如何创建的,以及与fork的关系

在这里插入图片描述

进程状态

在这里插入图片描述

运行态

运行态,顾名思义,该进程现在是可以被执行的,已经准备好被调用了。
在这里插入图片描述

注意:一个进程是否是运行态,看这个进程是否被放在运行队列(runqueue中),一个CPU只有一个运行队列(runqueue)

阻塞态和挂起

在这里插入图片描述

阻塞态,就是等待I/O完成的进程,需要I/O的进程去找对应的外设,连接外设的struct task_struct* head,形成链表,然后在等待输入数据的过程,这就是阻塞

挂起,就是由于操作系统空间不足时,我们将阻塞态的进程的空闲的代码和数据,换出(从内存放在硬盘中),这就叫做挂起。一般的挂起指的是阻塞挂起,运行挂起一般不出现。

换出是暂时调离内存,放在硬盘中,换入是被操作系统调入内存中,重新等待被执行。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第一百一十六天学习记录:C++提高:STL-string(黑马教学视频)

string基本概念 string是C风格的字符串&#xff0c;而string本质上是一个类 string和char区别 1、char是一个指针 2、string是一个类&#xff0c;类内部封装了char*&#xff0c;管理这个字符串&#xff0c;是一个char型的容器。 特点&#xff1a; string类内部封装了很多成员方…

C++——STL容器之list链表的讲解

目录 一.list的介绍 二.list类成员函数的讲解 2.2迭代器 三.添加删除数据&#xff1a; 3.1添加&#xff1a; 3.2删除数据 四.排序及去重函数&#xff1a; 错误案例如下&#xff1a; 方法如下&#xff1a; 一.list的介绍 list列表是序列容器&#xff0c;允许在序列内的任何…

Git学习

一、Git工作流程 二、Git学习 1.获取本地仓库 要使用Git对我们的代码进行版本控制&#xff0c;首先需要获得本地仓库 在电脑的任意位置创建一个空目录(例如test)作为我们的本地Git仓库进入这个目录中&#xff0c;点击右键打开Git bash窗口执行命令git init如果创建成功后可在…

点云处理——terrasolid教程

加载terrasolid软件模块 3、通过microstation的utilities->mdl applications加载terrasolid四个模块,加载成功后将显示tscan和tphoto的主窗口&#xff0c;以及四个模块的主工具箱。 浏览点云 4、显示点云坐标信息(类&#xff0c; 航带号&#xff0c;GPS信息&#xff0c;东…

文心一言 VS 讯飞星火 VS chatgpt (67)-- 算法导论6.5 6题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;67&#xff09;-- 算法导论6.5 6题 六、在 HEAP-INCREASE-KEY 的第 5 行的交换操作中&#xff0c;一般需要通过三次赋值来完成。想一想如何利用INSERTION-SORT 内循环部分的思想&#xff0c;只用一次赋值就完成这一交换操作? 文…

【Django+Vue】英文成绩管理平台--20230727

能够满足大部分核心需求&#xff08;标绿&#xff09;&#xff1a;报表部分应该比较难。 项目地址 前端编译 https://gitlab.com/m7840/toeic_vue_dist Vue源码 https://gitlab.com/m7840/toeic_vue Django源码 https://gitlab.com/m7840/toeic_python 项目架构 流程 …

嵌入式面试常见题目收藏(超总结)

​ 这篇文章来自很多博客主和其他网站的作者&#xff0c;如有侵权&#xff0c;联系必删 文章出处标注&#xff1a; https://blog.csdn.net/qq_44330858/article/details/128947083 ***如需PDF或者原稿可私信 *** ***如需PDF或者原稿可私信 *** ***如需PDF或者原稿可私信 *** 1.…

16位S912ZVML32F3MKH、S912ZVML31F1WKF、S912ZVML31F1MKH混合信号MCU,适用于汽车和工业电机控制应用。

S12 MagniV微控制器是易于使用且高度集成的混合信号MCU&#xff0c;非常适合用于汽车和工业应用。S12 MagniV MCU提供单芯片解决方案&#xff0c;是基于成熟的S12技术的完整系统级封装 (SiP) 解决方案&#xff0c;在整个产品组合内软件和工具都兼容。 S12 MagniV系统级封装 (S…

EP4CE6E22C8N Error: Can‘t recognize silicon ID for device 1

经过各种排查&#xff0c;发现是AS配置不对&#xff0c;仅供参考 工程 参考某处的工程画板配置的FPGA板子&#xff0c;用于学习入门FPGA。 烧录sof文件是正常的&#xff0c;并能正常运行。 但是烧录jic是failed&#xff0c;查看报错为&#xff1a;Error: Can’t recognize si…

【Maven】让maven更高效,优化maven构建项目速度

打开idea的setting&#xff0c;找到maven&#xff0c;设置它多线程数&#xff0c;重启后即可&#xff01; 我这里是8&#xff0c;你们可以随便设置。 如下图&#xff1a;

【高级数据结构】树状数组

目录 树状数组1 &#xff08;单点修改&#xff0c;区间查询&#xff09; 树状数组1 &#xff08;单点修改&#xff0c;区间查询&#xff09; 洛谷&#xff1a;树状数组1https://www.luogu.com.cn/problem/P3374 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行…

Vulnhub: shenron: 3靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.171 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.171 修改hosts后访问目标80端口&#xff0c;发现是wordpress wpscan收集目标用户&#xff0c;爆破出密码&#xff1a;ilov…

前后端分离开发流程

1、介绍 在前后端分离开发中&#xff0c;前端负责用户界面和交互逻辑的实现&#xff0c;后端则处理业务逻辑和数据持久化。这种开发模式的优势在于前后端可以独立进行开发&#xff0c;提高了开发效率&#xff0c;并且使得前后端可以采用不同的技术栈来实现各自的功能。 2、开…

LabVIEW FPGA开发实时滑动摩擦系统

LabVIEW FPGA开发实时滑动摩擦系统 由于非线性摩擦效应的建模和补偿的固有困难&#xff0c;摩擦系统的运动控制已被广泛研究。最近&#xff0c;人们更加关注滑动动力学和滑动定位&#xff0c;作为传统机器人定位的低成本和更灵活的驱动替代方案。摩擦控制器设计和适当选择基础…

NodeJs后端项目使用docker打包部署

docker安装看之前的文章 默认已经安装好docker并且配置没有问题 拉取项目 https://gitee.com/coder-msc/docker-node 本地跑一个看看 pnpm install pnpm start 本地访问 http://localhost:1301/getname?name%E5%93%88%E5%88%A9%E6%B3%A2%E7%89%B9项目整个上传服务器 查看…

【Spring】Spring之循环依赖底层源码解析

什么是循环依赖 A依赖了B&#xff0c;B依赖了A。 示例&#xff1a; // A依赖了B class A{public B b; }// B依赖了A class B{public A a; }其实&#xff0c;循环依赖并不是问题&#xff0c;因为对象之间相互依赖是很正常的事情。示例&#xff1a; A a new A(); B b new B…

如何快速用PHP取短信验证码

要用PHP获取短信验证码&#xff0c;通常需要连接到一个短信服务提供商的API&#xff0c;并通过该API发送请求来获取验证码。由于不同的短信服务提供商可能具有不同的API和授权方式&#xff0c;我将以一个简单的示例介绍如何使用Go语言来获取短信验证码。 在这个示例中&#xff…

信驰达推出RTL8720DN系列2.4G和5G双频Wi-Fi+蓝牙二合一模块

近日&#xff0c;领先的无线物联网通信模块厂商深圳信驰达科技RF-star推出了基于RTL8720DN SoC的2.4 GHz和5 GHz双频Wi-Fi蓝牙二合一模块—RF-WM-20DNB1。 图 1信驰达RF-WM-20DNB1 Wi-Fi模块 RF-WM-20DNB1是一款低功耗单芯片无线蓝牙和Wi-Fi组合模块&#xff0c;支持双频(2.4 G…

php://filter绕过死亡exit

文章目录 php://filter绕过死亡exit前言[EIS 2019]EzPOP绕过exit 参考 php://filter绕过死亡exit 前言 最近写了一道反序列化的题&#xff0c;其中有一个需要通过php://filter去绕过死亡exit()的小trick&#xff0c;这里通过一道题目来讲解 [EIS 2019]EzPOP 题目源码&#…

IO进程线程第三天(7.31)time,localtime,文件io函数:open,umask,close,write,read,lseek,stat,

用read函数完成图片文件拷贝 #include<stdio.h> #include<head.h> int main(int argc, const char *argv[]) {//umask(0);//将文件权限掩码改为0&#xff0c;使得其他用户可写int fd open("/home/ubuntu/图片/2.jpg",O_RDONLY,0777);//打开图片if(fd&l…