Linux进程总结(下)

Linux进程——进程退出 线程。 阅读详情

进程创建

fork()

原理:为子进程重新创建一个task_struct,以及对应的虚拟地址空间和页表,并且将父进程的 数据(包括缓冲区的数据)和代码拷贝一份至子进程pcb中
返回值:对父进程而言:fork()成功返回子进程的进程id;失败返回-1.
对子进程而言:fork()成功返回0;失败返回-1。
fork返回值验证代码:

#include<stdio.h>                                                                                                 
#include<unistd.h>                                                                                                
#include<stdlib.h>                                                                                                
int main()                                                                                                        
{                                                                                                                 
     pid_t pid;                                                                                                      
     int count = 0;                                                                                                  
     printf("before: pid = %d\n", getpid());                                                                                                                                                                           
     pid = fork();                                                                                                                                                                                                                                                                                                  
     if(pid < 0) {                                                                                                             
       perror("fork");                                                                                                                                                    
     }                                                                                                             
     else if(pid == 0){                                                                                            
       printf("child:pid =  %d,  return = %d\n",  getpid(), pid);                                                                           
       exit(0);                                                                                                    
     }                         
     printf("after: pid = %d, return = %d\n", getpid(), pid);                                                      
     return 0;
}

在这里插入图片描述
失败原因:系统资源不够,无法再次创建进程
用户的进程数超过了限制
模拟不可再创建进程代码:

#include<stdio.h>                                                                                                 
#include<unistd.h>                                                                                                
#include<stdlib.h>                                                                                                
int main()                                                                                                        
{                                                                                                                 
   pid_t pid;                                                                                                      
   int count = 0;                                                                                                                                                                      
   while(1){                                                                                                       
   	  pid = fork();                                                                                                                                                                                                     
      usleep(2000);                                                                                                 
      if(pid < 0)                                                                                                   
      {                                                                                                             
  	     printf("this computer can fork %d times\n",count);                                                          
         return 1;                                                                                                   
      }                                                                                                             
     else if(pid == 0){
     	 printf("child have %d\n", count);                                                                                                                                                                 
         exit(0);                                                                                                    
      } 
      count++;                                                                                                              
   }                                                                                                                                                                 
   return 0;
}

在这里插入图片描述
vfork()
原理: 只为子进程创建一个task_struct,父子进程共享虚拟地址空间,父子进程中的任意一 个进程修改了数据,那么父子进程中的数据也会被修改
保证子进程先于父进程运行,并且只有子进程调用了exit之后,父进程才可以运行
代码验证:

#include<stdio.h>                                                                                                 
#include<unistd.h>                                                                                                
#include<stdlib.h> 
int main()                                                                                                        
{                                                                                                                 
    int value = 100;                                                                                                
    pid_t pid = vfork();                                                                                            
    if(pid == 0)                                                                                                    
    {                                                                                                               
        printf("child, pid = %d, ppid = %d, value = %d\n",getpid(), getppid(), value);                                
        value = 2020;                                                                                                 
        sleep(1);                                                                                                     
        printf("child, pid = %d, ppid = %d, value = %d\n",getpid(), getppid(), value);                                
        exit(0);                                                                                                      
    }                                                                                                               
    printf("child, pid = %d, ppid = %d, value = %d\n",getpid(), getppid(), value);                                  
    sleep(2);                                                                                                       
    printf("child, pid = %d, ppid = %d, value = %d\n",getpid(), getppid(), value);                                  
    return 0;                                                                                                       
}

进程终止:

三种退出情景:
1.代码运行完毕,结果正确
2.代码运行完毕,结果不正确
3.代码运行异常终止

退出方法:(echo $? : 查看上一条命令的退出码)
main函数(主函数)中退出
return
exit(num)
调用exit(num)退出
调用_exit(num)退出
exit()、return、_exit()的区别:
1.return只有在主函数中才能结束进程,在非主函数中,只能退出该函数
2.return 在主函数中调用相当于exit()
3.exit() 是温和式退出,在调用了exit之后,进程会刷新缓冲区,关闭文件等…
4._exit() 是粗暴式退出,一旦调用_exit()后,进程会直接释放所有资源,结束进程
5.exit()和_exit() 在进程任意位置都能直接结束进程,其参数代表进程退出码!
注:char* strerror(int num); 作用是将错误编号num 转换为字符串的错误信息

进程等待

必要性:避免形成僵尸进程,造成内存泄漏,资源浪费

等待方法
1.阻塞式等待:
pid_t wait(int* status);
成功返回被等待的进程的进程id
失败返回-1
status是一个输出型参数,代表获取子进程的退出状态(退出码)
2.非阻塞式等待:
pid_t waitpid(pid, status, options)
pid 设置为-1,表示等待任意进程
>0 表示要等待的进程的进程id
option :一个选项参数 可man了解
status(子进程退出状态(退出码))
如图:
在这里插入图片描述
相当于一个位图,4个字节,32个比特位
但是只用到了 低16位比特位
其中高8位代表退出码,低8位表示核心转储(第七位)和终止信号
进程若正常退出,那么只有退出码,没有终止信号(只用到高8位)
若异常退出,那么没有退出码,只有终止信号(只用到低8位)

进程程序替换

重点:程序替换,并没有创建新的进程,只是将原有的代码和数据替换为新的可执行程序的代码 和数据

程序替换函数
execl(文件路径,变长的命令行参数…) 命令行参数必须以NULL结尾
execlp(文件名,变长的命令行参数…)
execle(文件路径,变长的命令行参数…,自己配置的环境变量数组)
execv(文件路径,命令行参数数组)
execvp(文件名,命令行参数数组)
execve(文件路径,命令行参数数组,自己配置的环境变量数组)
注:替换成功之后,程序便从替换处开始执行新的程序,不再返回
替换成功,没有返回值,替换失败,返回-1
只有execve是系统调用函数,其他均是被封装的库函数
进程替换 ls 指令 代码:

#include<unistd.h>                                                                                              
#include<stdlib.h> 
int main()                                                                                                      
{                                                                                                               
    //execl("/usr/bin/ls", "ls", "-al", NULL);                                                                    
    printf("-----------\n");                                                                                      
    //execlp("ls", "ls", "-al", NULL);                                                                            
    char* env[] = {                                                                                               
      "AAAA=aaaa",                                                                                                
      NULL,     //must use NULL become last                                                                       
    };                                                                                                            
    //execle("./a.out", "./a.out", NULL, env);                                                                    
    //printf("---------------\n");                                                                                
    char* argv[] = {                                                                                              
      "ls",                                                                                                       
      "-al",                                                                                                      
      NULL                                                                                                        
    };                                                                                                            
    char *argv1[] = {"./a.out", NULL};                                                                            
    //execv("/usr/bin/ls", argv);                                                                                 
    //execvp("ls", argv);                                                                                         
    execve("./a.out", argv1, env);                                                                                
} 

关于一些细的知识点,还是有些不熟,我会下次补全!!
在这里插入图片描述

Linux创建进程链、进程扇、进程树 如何创建进程链、进程扇、进程树 阅读详情

相关推荐

纯JS实现SM3加密算法(兼容IE浏览器)

纯JS实现SM3加密,IE、谷歌、火狐等浏览器可以直接使用。

qianpou的博客 7353

进程控制 -- 进程的创建,终止与等待

在前面的学习中我们已经了解了进程相关的基本概念,接下来我们来谈谈进程创建与进程等待。 进程创建 fork函数 在linux中fork函数的作用是从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 #include <unistd.h> pid_t fork(void); 返回值:自进程中返回0,父进程返回子进程id,出错返回-1 当操作系统调用fork函数时候,操作系统会进行什么操作呢? 分配新的内存块和内核数据结构给子进程 将父进程部分数据结构内容拷贝至子进程 添加子进程到系

ifwecande的博客 356

论文阅读:Visual Relationship Detection with Language Priors

Visual Relationship Detection with Language Priors(ECCV2016) 文章   尽管大多数的relationship并不常见,但是它们的object和predicate却更频繁地独立出现。paper用这个insight分别独立训练训练object和predicate的模型,然后再进行组合来预测relationship。Visual relatio...

Kivee的博客 2877

【Linux入门】进程概念(超详解,建议收藏)

系统中,可以存在大量进程的 当我们的电脑开机的时候,启动的第一个进程是操作系统(os),而os要对之后运行起来的进程进行管理工作(进程管理)。 操作系统如何进行进程管理?? (先描述,在组织)、 当有大量程序加载到内存中时,就如同系统中同时出现大量进程,操作系统会增添大量的PCB对这些进程进行描述,并用链表的方式对PCB组织起来。 1、标示符: 前台进程,只能有一个前台进程 +& 在后台跑 +表示前台还是后台 2、优先级 什么是优先级? 谁先谁后拿到某种资源 为什么要有优先级? 资源有限。 CPU

qq_53505979的博客 8700

Android 默认授予所有应用权限以及特殊权限处理

PackageManagerService作为android的主要系统服务之一,包含处理应用权限相关的职责。源码地址如下:在PMS成功启动时并收到回掉systemReady回进行应用权限授予。DefaultPermissionGrantPolicy为权限处理策略管理类。这里并没有赋予所有系统应用权限,所以当进行应用时还是会显示权限检查的弹框。可通过此方法进行所有应用权限赋予:如果不想所有应用都授予权限,可考虑在system/etc下的权限相关xml文件添加应用包名和所需权限。

Jimmy的专栏 1509

VScode - 从入门到精通:高效开发环境搭建指南

本文是一份全面的VSCode高效开发环境搭建指南。从选择理由、安装配置、核心插件推荐到个性化设置与高效技巧,详细讲解了如何将这款轻量级编辑器武装成强大的开发工具。重点介绍了GitLens、Prettier、Live Server等必备插件,以及通过用户设置、代码片段和快捷键打造专属高效工作流的方法,帮助开发者从入门到精通。

weixin_27734811的博客 426

Linux之进程

进程是程序的一次执行。进程是可以并行执行的计算。进程是一个程序与其使用的数据在处理机上顺序执行时发生的活动。进程是程序在一个数据集合上的运行过程。它是系统进行资源分配和调度的一个独立单位作业控制--- 一个命令行功能,允许一个shell实例来运行和管理多个命令,Shell的一个特性,使用户能在多个独立进程间进行切换命令及作用命令作用cmd&该命令在后台运行Ctrl+d终止一个正在前台运行的进程(含有正常含义)Ctrl+c终止一个正在前台运行的进程(含有强行含义)

qq_57289939的博客 3221

Python爬虫实战:利用最新技术高效爬取百度贴吧帖子内容

本文将详细介绍如何使用Python最新技术栈构建一个高效的百度贴吧爬虫,包括requests-html异步请求、BeautifulSoup4解析、数据存储到MongoDB以及应对反爬机制等完整解决方案。文章包含5000余字详细教程和完整代码实现。网络爬虫(Web Crawler)是一种自动获取网页内容的程序,广泛应用于搜索引擎、数据分析和内容聚合等领域。Python凭借其丰富的库生态系统成为爬虫开发的首选语言。贴吧作为中文互联网最大的兴趣社区,包含大量有价值的UGC内容。动态加载内容处理登录状态维持。

2201_76125261的博客 541

【Linux:进程】

进程相关详述

qq_46076785的博客 1570

SAP 实例解析分期付款配置及应用

SAP系统的付款条件支持分期付款功能,其奥妙之处就在于需要定义一个母条款和一个子条款,其中,母条款需要标识“分期付款”。 首先,定义分期付款的母条款OBB8:             然后,定义子条款(即分期付款的具体方式)OBB9:   由上图可以看出,分期付款的配置还是很强大的,针对每次付款,都可以进行第二层次付款条件的设置。   然后,我们做一笔发票,

heng0757的专栏 1万+

【Flutter 问题系列第 16 篇】如何防止软键盘弹出后顶掉内容

Flutter 如何防止软键盘弹出后顶掉内容

“Allen Su”的博客 3317

Linux —— 进程概念超详解!

本篇文章从最基本的操作系统理论出发,映射到Linux系统上。主要介绍的有什么是进程、进程是如何被管理的、进程状态,以及描述Linux对于进程是怎么做的。还详细介绍了僵尸进程、孤儿进程、父子进程、进程优先级以及并发、环境变量等基本概念。只要大家从头到尾仔细看,就一定能有所收获!

weixin_59913110的博客 6048

ComfyUI 局部重绘工作流示例

本文介绍了使用ComfyUI进行图像局部重绘的基础工作流程,重点讲解如何修改人物眼睛颜色和表情。主要内容包括:1.准备工作(可选下载DreamShaperv8模型);2.加载素材图片和工作流文件;3.使用遮罩编辑器绘制需要修改的区域;4.修改提示词控制生成内容;5.调整denoise参数优化效果。教程提供了详细的提示词示例(如"smile,blackeyes"等)和参数设置建议,帮助用户通过多次尝试获得理想效果。该工作流适用于修改图像局部区域而不影响整体画面。

云域A的博客 331

【Linux】进程

本文将详细的介绍Linux环境的进程,与进程状态和进程优先级。

Yui_的博客 2049

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

linux中什么是进程名,Linux进程是什么

进程是 Linux 操作系统中最重要的基本概念之一,这一节我们将了解学习 Linux 进程的一些基础知识。进程是运行在 Linux 中的程序的一个实例。这是一个你之前就可能已经听说过的基本定义。当你在 Linux 系统中执行一个程序时,系统会为这个程序创建特定的环境。这个环境包含系统运行这个程序所需的任何东西。每当你在 Linux 中执行一个命令,它都会创建,或启动一个新的进程。比如,当你尝试运行...

weixin_39551554的博客 2053

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

<Linux> 进程

进程有关概念、如何创建进程、进程状态、环境变量详解、进程优先级、程序地址空间、如何控制进程以及如何替换进程

weixin_61522065的博客 4302

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【linux】进程控制——进程创建,进程退出,进程等待

一个进程创建了另一个进程,创建者为父进程,被创建者为子进程。父进程可以创建多个子进程。操作系统是一号进程,所有进程构成一颗多叉树结构。每个父进程只对直系的子进程负责。父进程创建子进程的一整套流程为:创建子进程——>子进程完成任务——>父进程回收子进程父进程先退,子进程未退。此时子进程的父亲进程被改为1号进程(操作系统),那么该子进程被称为孤儿进程父进程未退,子进程先退。但父进程没有读取到子进程的退出(进程等待),该子进程的状态被改为 Z 状态,Z 状态的进程被成为僵尸进程。

2301_79796701的博客 2708

【linux 多进程并发】0301 Linux创建后台服务进程,daemon进程,自己的进程可以被一号进程接管啦

通常我们在终端启动程序,该程序的父进程一般是终端进程,这样在终端退出时,会产生像SIGHUG信号发给所有子进程,子进程默认处理是退出。 我们要创建后台服务进程时,必需让进程与终端无关,这就是示例代码中经过一次fork之后,父进程退出,而子进程让systemd接管的真正作用。 本章节代码位于[gitcode](https://gitcode.com/toadb/hatchCode/overview), 路径为: multiProcess/ex02_multiprocess, 有兴趣的同学可以下载测试,当然

一个追逐梦想的码农 3233

Linux进程——Linux下常见的进程状态

在了解Linux中进程的分类时,我们通常是先了解操作系统的进程,因为二者有一定的联系,了解操作系统能更好理解进程在操作系统中的运行关系。进程状态在进程中也极为重要,希望大家能理解透彻!

EterNity_TiMe_的计算机学习之路 2792

【Linux】Linux进程管理

Linux进程管理

Linux小白一只~正处于学习阶段,觉得我写的还好的请多多给我点赞呀,谢谢大家!!(๑>ڡ<)☆ 5213

Linux进程控制——Linux进程终止

进程终止相对于其他的进程控制来说,是很好理解的。我们主要介绍了进程终止,在明白错误码和退出码之后,相信能理解父进程是怎么得到子进程信息的。让我们期待下一节——进程等待与替换!

EterNity_TiMe_的计算机学习之路 2343

linux进程

这个文件用来检查内核数据结构的当前状态,通常由GDB调试使用 /proc/kmsg:此文件用来保存由内核输出的信息 /proc/meminfo:系统中关于当前内存的利用状况等的信息,常由free命令使用 /proc/version:当前系统运行的版本号 /proc/sys:与/proc下其他文件的只读属性不同,管理员可对/proc/sys子目录中的徐彤文件内容进行修改以更改内核的运行特性,事先可以使用ls -l查看某文件是否可写入。进程是程序的一次执行过程,动态的,包括创建、调度、执行和消亡。

m0_45148083的博客 1621

Linux——进程概念

进程概念精析

2302_81486993的博客 3290

linux查找被杀死的进程,linux查找进程和杀死进程

查看进程:ps -ef | grep 检索内容杀死进程:kill pid (进程号)kill -9 pid 强制杀死进程ps命令将某个进程显示出来grep命令是查找中间的|是管道命令 是指ps命令与grep同时执行PS是LINUX下最常用的也是非常强大的进程查看命令grep命令是查找,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是G...

weixin_34944897的博客 2447

linux 系统master进程,Linux进程监视

由于复刻了 mon 项目到 etbemon 中,我花了一些时间做监视脚本。事实上监视一些事情通常很容易,但是决定监视什么才是困难的部分。进程监视脚本 ps.monitor 是我重新设计过的一个。对于进程监视我有一些思路。如果你对进程监视如何做的更好有任何建议,请通过评论区告诉我。给不使用 mon 的人介绍一下,如果一切 OK 该监视脚本就返回 0,而如果有问题它会返回 1,并使用标准输出显示错误信...

weixin_35598104的博客 2776

Linux进程状态

在当前的Linux版本中,这些状态是互斥的,因此,严格意义上说,只能设置一种状态,其余的标志将被清除。当父进程结束时,操作系统会将孤儿进程的父进程重新指定为 init 进程(PID 为 1),init 进程会负责清理和管理这些孤儿进程。子进程先睡眠 5 秒后退出,父进程睡眠 10 秒,在这段时间差内,子进程可能处于僵尸状态等待父进程来处理它的退出信息。代码中,父进程执行10秒后退出,而子进程会一直循环,在10秒前观察到父子进程都是正常的,而10秒之后,只有子进程了,且它的PPID变成1。

weixin_71964451的博客 1218
上一篇: 虚拟地址空间
下一篇: 基础文件I\O
Code_zx
博客等级 码龄9年 83粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值