进程的创建和回收

news2025/1/4 19:10:52

一、进程概念:程序运行的状态

程序:

1.存放在磁盘上的指令和数据的有序集合(文件)

2.静态的

进程:

1.执行一个程序所分配的资源的总称

2.动态的

进程和程序内容区别

进程包含的内容:

BSS段:存放程序中未初始化的全局变量

数据段:已初始化的全局变量

代码段:程序执行代码

堆(heap):malloc等函数分配内存

栈(stack):局部变量,函数参数,函数的返回值

进程控制块(pcb):PID, 进程优先级,文件描述符表

进程类型:交互进程、批处理进程、守护进程。

进程状态:运行态、等待态、停止态、死亡态:

二、进程常用命令

查看进程信息

ps     查看系统进程快照

top    查看进程动态信息

/proc  查看进程详细信息

ps 命令详细参数:

-e:显示所有进程

-l:长格式显示更加详细的信息

-f 全部列出,通常和其他选项联用

表头

含义

F

进程标志,说明进程的权限,常见的标志有两个:

  • 1:进程可以被复制,但是不能被执行;
  • 4:进程使用超级用户权限;

S

进程状态。进程状态。常见的状态有以下几种:

  1. -D:不可被唤醒的睡眠状态,通常用于 I/O 情况。
  2. -R:该进程正在运行。
  3. -S:该进程处于睡眠状态,可被唤醒。
  4. -T:停止状态,可能是在后台暂停或进程处于除错状态。
  5. -W:内存交互状态(从 2.6 内核开始无效)。
  6. -X:死掉的进程(应该不会出现)。
  7. -Z:僵尸进程。进程已经中止,但是部分程序还在内存当中。
  8. -<:高优先级(以下状态在 BSD 格式中出现)。
  9. -N:低优先级。
  10. -L:被锁入内存。
  11. -s:包含子进程。
  12. -l:多线程(小写 L)。
  13. -+:位于后台。

UID

运行此进程的用户的 ID;

PID

进程的 ID;

PPID

父进程的 ID;

C

该进程的 CPU 使用率,单位是百分比;

PRI

进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;

NI

进程的优先级,数值越小,该进程越早被执行;

ADDR

该进程在内存的哪个位置;

SZ

该进程占用多大内存;

WCHAN

该进程是否运行。"-"代表正在运行;

TTY

该进程由哪个终端产生;

TIME

该进程占用 CPU 的运算时间,注意不是系统时间;

CMD

产生此进程的命令名;

top    查看进程动态信息

shift +> 后翻页

shift +< 前翻页

top -p PID  查看某个进程

改变进程优先级

nice   按用户指定的优先级运行进程

     nice [-n NI值] 命令

NI 范围是 -20~19。数值越大优先级越低

普通用户调整 NI 值的范围是 0~19,而且只能调整自己的进程。

普通用户只能调高 NI 值,而不能降低。如原本 NI 值为 0,则只能调整为大于 0。

只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程。

renice   改变正在运行进程的优先级

    renice [优先级] PID

jobs   查看后台进程

bg     将挂起的进程在后台运行

fg      把后台运行的进程放到前台运行

ctrl+z  把运行的前台进程转为后台并停止。

./test &  把test程序后台运行

三、创建子进程:

子进程概念:

#include  <unistd.h>

 pid_t  fork(void);

创建新的进程,失败时返回-1

成功时父进程返回子进程的进程号,子进程返回0

通过fork的返回值区分父进程和子进程

要点:1.子进程只执行fork之后的代码

        2.父子进程执行顺序是操作系统决定的。

#include <stdio.h>
#include <unistd.h>

int main(int argc,char **argv){
    
    pid_t pid;
    printf("before fork\n");
    pid = fork();
    if(pid>0){
       printf("This is father process\n");
       printf("pid=%d\n",(int)pid);
       printf("father after fork\n");
       while(1){
         sleep(1);
         printf("father sleep\n");
       }
   }else if(pid==0){
       printf("This is child process\n");
       printf("pid=%d\n",(int)pid);
       printf("child after fork\n");
       while(1){
          sleep(1);
          printf("child sleep\n");
       }
    }else if(pid<0){
       perror("fork");
       return 0;
    }
   // printf("pid=%d\n",(int)pid);
  //  printf("after fork\n");
  

}

子进程继承了父进程的内容

父子进程有独立的地址空间,互不影响

若父进程先结束

子进程成为孤儿进程,被init进程收养

子进程变成后台进程(kill -9 19516杀死进程) 

若子进程先结束

父进程如果没有及时回收,子进程变成僵尸进程

#include <stdio.h>
#include <unistd.h>

int main(){
    pid_t pid;
    int i;    
    for(i=0;i<5;i++){
        pid = fork();
        if(pid<0){
            perror("fork");
            return 0;
        }else if(pid==0){
            printf("child process\n");
            sleep(5);
            break;
        }else{
            printf("Father process\n");
            sleep(5);
        }
    }

    sleep(100);


}

进程的退出

#include <stdlib.h>

 #include  <unistd.h>

 void  exit(int  status);

 void  _exit(int  status);

结束当前的进程并将status返回

exit结束进程时会刷新(流)缓冲区

return 和exit的区别:main函数结束时会隐式地调用exit函数,普通函数return是返回上一级。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc,char**argv){

   printf("hello world");
   _exit(0);
   printf("after exit");
   return 0;
}

进程的回收

#include  <unistd.h>

  pid_t wait(int *status);

 成功时返回回收的子进程的进程号;失败时返回EOF

 若子进程没有结束,父进程一直阻塞

 若有多个子进程,哪个先结束就先回收

 status 指定保存子进程返回值和结束方式的地址

 status为NULL表示直接释放子进程PCB,不接收返回值

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

int main(int argc, char** argv){

   pid_t pid;
   pid_t rpid;
   pid = fork();
   int status;
   if(pid<0){
      perror("fork");
      return 0;
   }
   else if(pid == 0){
       sleep(10);
       printf("child will exit\n");
       exit(2);

   }else if(pid >0){
       //rpid = wait(&status);
       sleep(20);
       waitpid(-1,&status,WNOHANG);
       printf("Get child status=%x\n",WEXITSTATUS(status));
   }

   while(1){
     sleep(1);
   }

}

#include  <unistd.h>

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

参数:

pid

pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。

pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。

pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。

pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。

options

options提供了一些额外的选项来控制waitpid,目前在Linux中只支持WNOHANG和WUNTRACED两个选项,这是两个常数,可以用"|"运算符把它们连接起来使用

WNOHANG :若由pid指定的子进程未发生状态改变(没有结束),则waitpid()不阻塞,立即返回0

WUNTRACED: 返回终止子进程信息和因信号停止的子进程信息

 wait(wait_stat) 等价于waitpid(-1,wait_stat,0)

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

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

相关文章

Buffer Pool

Buffer Pool Innodb 存储引擎设计了一个缓冲池&#xff0c;来提升读写的性能。 在 MySQL 启动的时候&#xff0c;InnoDB 会为 Buffer Pool 申请一片连续的内存空间&#xff0c;然后按照默认的16KB的大小划分出一个个的页&#xff0c; Buffer Pool 中的页就叫做缓存页。此时这些…

java 社区人口管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 社区人口管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

Linux安装Zookeeper、Hadoop、Hive、Hbase全家桶系列

目录 Linux安装配置Zookeeper Linux安装配置Hadoop Linux安装Hbase Linux安装配置Zookeeper 新建文件夹 mkdir /home/zookeeper 下载到指定文件夹 官网 Apache ZooKeeper wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.1/apache-zookeeper-3.8.1-bin.tar.gz…

Jmeter的JSON断言

JSON断言是测试工作中经常用到的一种断言方法&#xff0c;一般用于断言某个字段值是否等于我们指定的值。所以JSON断言只能针对响应结果为applicaton/json格式的进行断言操作。 如果是其他类型&#xff08;如&#xff1a;Test、html&#xff09;&#xff0c;则无法使用这种方式…

【神经网络】tenorflow实验11--人工神经网络(2)

1. 实验目的 ①掌握梯度下降法的优化算法&#xff1b; ②能够使用tf.keras构建Sequential模型&#xff0c;完成多分类任务。 2. 实验内容 ①下载MNIST数据集&#xff0c;建立神经网络模型&#xff0c;实现对MNIST手写数字数据集的识别&#xff0c;调整超参数和训练参数&…

公网对讲SDK——对讲应用场景

anyRTC 公网对讲 SDK的发布&#xff0c;解决了开发者想做公网对讲应用但没有技术的困境&#xff1b;SDK全平台支持的特性&#xff0c;让开发者可以在任何平台接入对讲能力&#xff1b;同时因为包体积小、对业务零入侵等特性被运用到各行各业中&#xff0c;下面咱们就来聊一聊公…

ansible——利用主机模式选择主机

一&#xff1a;主机模式&#xff1a;对目标主机的一种选择方式 1.以student用户身份并使用student作为密码登录workstations ssh studentworkstation 2.创建projects-host项目文件&#xff0c;并下载ansible配置文件 lab projects-host start 3.在 workstation上更改到/home…

恭喜星球又一名小伙伴上岸大厂

大家好&#xff0c;我是冰河~~ 星球里有不少小伙伴经过自己的努力&#xff0c;认真学习和总结&#xff0c;最终拿到了自己心仪的大厂Offer&#xff01;本来想给大家分享下的&#xff0c;但是&#xff0c;过去挺长一段时间冰河都处于“全天候工作状态”&#xff0c;经常加班到晚…

业务连续性管理的重要性体现在哪里?

业务连续性管理的重要性体现在哪里&#xff1f;随着全球化、信息化和市场竞争加剧&#xff0c;企业面临的风险越来越多样化、复杂化。突发事件如自然灾害、供应链中断、网络攻击等都有可能对企业生产经营带来巨大影响&#xff0c;甚至导致公司破产倒闭。因此&#xff0c;保证业…

day14 - 提取图像信息

本期主要介绍图像的礼帽运算和黑帽运算&#xff0c;礼帽运算常用于获取原始图像的噪声信息&#xff0c;或者得到比原始图像的边缘更亮的边缘信息&#xff1b;黑帽运算常用来检测图像中的波谷结构&#xff0c;分离比邻近点暗一些的斑块&#xff0c;比如得到轮廓效果图。 完成本…

数据结构——实现单向链表

文章目录 :cow:前言:banana:单链表与顺序表的对比:orange:单链表的初始操作及结构体:watermelon:申请一个节点:carrot:打印:strawberry:销毁:apple:尾插:pear:尾删:grapes:头插:peach:头删:pineapple:数据的查找:lemon:数据的修改:tomato:在pos位置之后插入节点:potato:在pos位…

编辑距离算法

给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符 删除一个字符 替换一个字符 示例 1&#xff1a; 输入&#xff1a;word1 "horse", word2 "ros&quo…

ChatGPT真的可以帮助你申请留学吗?未必!

在留学申请的整个流程中&#xff0c;如果说哪一项是最不可或缺的项目&#xff0c;那“文书写作”一定首当其冲。国外院校对学生的评估参考项目&#xff0c;除了文书以外&#xff0c;也在不断地探寻更多的评估方式来全面地了解申请的学生。 从加州大学的申请流程中可以了解到这方…

Spring 之 jwt,过滤器,拦截器,aop,监听器

Spring 之 jwt&#xff0c;过滤器&#xff0c;拦截器&#xff0c;aop&#xff0c;监听器 一、jwt编写1.1 pom1.2 JwtUtils1.3 注意1.4 用法 二、过滤器2.1 原理2.2 使用场景2.3 使用步骤2.3.1 自定义过滤器类implements Filter2.3.2 配置类2.3.3 过滤器使用场景 2.4 问题 三、拦…

中美信托金融大厦(总体)建筑能耗管理系统的设计与应用

摘要&#xff1a;大型公共建筑总面积不足城镇建筑总面积的4%&#xff0c;但总能耗却占全国城镇总耗电量的22%&#xff0c;大型公共建筑单位面积年耗电量达到70&#xff5e;300KWh&#xff0c;为普通居民住宅的10&#xff5e;20倍。公共建筑是节能大户和节能主要对象&#xff0c…

这些论文的作者居然是猫、狗、仓鼠……

01 猩猩 Journal of Applied Animal Welfare Science 期刊在2007年发表了论文 Welfare of Apes in Captive Environments: Comments On, and By, a Specific Group of Apes &#xff08;圈养环境中的猿类福利&#xff1a;对特定类群的评论”&#xff09;&#xff0c;作者Sue S…

Web服务组合优化 基于改进哈里斯鹰算法的Web服务组合优化【Matlab代码22#】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第7节&#xff1a;资源获取】1. Web服务2. QoS感知的Web服务组合3. 改进后的CHHO算法3.1 原始HHO算法3.2 CHHO算法 4. 优化目标5. 部分代码展示6. 仿真结果展示7. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章…

详解token已过期含义及解决方 token过期是否需要重新登录

详解token已过期含义及解决方 token过期是否需要重新登录Web应用和用户的身份验证息息相关&#xff0c;从单一服务器架构到分布式服务架构再到微服务架构&#xff0c;用户安全认证和授权的机制也一直在演进&#xff0c;下文对各个架构下的认证机制做个总结。单一服务器架构该架…

day19 - 使用高通滤波提取图像边缘

在OpenCV中&#xff0c;对于图像或者视频的处理都或多或少的会涉及傅里叶变换的概念。在数学上&#xff0c;傅里叶变换是指所有的波形都可以由一系列简单且频率不同的正弦曲线叠加得到。也就是说&#xff0c;人们所看到的波形都是由其他波形叠加得到的。这个概念对操作图像非常…

Linus Torvalds发布了第一个Linux内核6.4候选版本

导读自Linux内核6.3发布和下一个内核系列Linux 6.4的合并窗口开放以来&#xff0c;已经过去了一段时间&#xff0c;近日&#xff0c;Linus Torvalds发布了第一个RC&#xff08;候选发布版&#xff09;的里程碑&#xff0c;供公众测试。 为期两周的Linux内核6.4合并窗口现已关闭…