当前位置: 首页 > news >正文

C语言进程

什么是进程
什么是程序
一组可以被计算机直接识别的 有序 指令 的集合。
通俗讲:C语言编译后生成的可执行文件就是一个程序。

那么程序是静态还是动态的?
程序是可以被存储在磁盘上的,所以程序是静态的。

那什么是进程

进程是程序的执行过程,是动态的,随着程序的使用被创建,随着程序的结束而消亡。
可以说进程是一个独立的可调度的任务。
进程是系统调度的独立任务。
进程是程序执行的独立任务。
进程是资源(内存资源)管理的最小任务。
一个程序可以只有一个进程,此时正在运行的这个程序也叫进程。
一个程序也可以有多个进程,此时正在运行的这个程序有多个进程动态执行。
所以说进程可以是程序,但程序不一定是进程。

注意:每一个程序运行时,操作系统分配给进程的 是虚拟内存,意味着每一个进程所使用的空间都是虚拟内存, 虚拟内存会被单元管理模块(MMU)映射到物理内存上,如何映射是操作系统关心的事情,程序开发者不用关心。

时间片
进程有多个,而CPU只有一个,假设该CPU是单核的,那么在某一时刻CPU只能处理一个进程,但是不能一直去处理这个进程,得多个进程之间轮流处理,给用户感觉这些进程在同时进行,而CPU处理一个进程的时间段即时间片。时间片是约定好CPU处理一个进程的时间段。

进程的类型

交互进程:完成人机交互的进程,比如shell
批处理进程:比如gcc的四步流程
守护进程:开机自启动,关机自动关闭(后台运行)
进程的状态

就绪状态:具备运行条件,等待处理器运行的进程。
当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行,进程这时的状态称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。
运行状态:处理器正在运行的进程。
等待状态:又称阻塞态或睡眠态,指进程不具备运行条件,正在等待某个时间完成的状态。
也称为等待或睡眠状态,一个进程正在等待某一事件发生(例如请求I/O而等待I/O完成等)而暂时停止运行,这时即使把处理机分配给进程也无法运行,故称该进程处于阻塞状态。
死亡状态:运行结束的进程。
进程的模式

终端:内核发送的信号。
系统调用:调用操作系统提供给用户来访问硬件的一组接口。

进程三态模型
运行态→等待态:等待使用资源;如等待外设传输;等待人工干预。
等待态→就绪态:资源得到满足;如外设传输结束;人工干预完成。
运行态→就绪态:运行时间片到;出现有更高优先权进程。
就绪态—→运行态:CPU 空闲时选择一个就绪进程。

 

孤儿进程
指父进程先于子进程退出,此时子进程称为孤儿进程。但是该进程会被pid为1的init进程收养。

僵尸进程
指子进程先于父进程退出并且没有被父进程回收子进程的资源。此时子进程就会变成僵尸进程。僵尸进程会造成浪费空间、资源泄露等问题。

进程的相关系统调用

 

创建进程

  1. 每个进程都由父进程创建。
  2. 通过系统调用函数 fork() 实现进程创建。

fork()

头文件:<sys/types.h> <unistd.h>
函数原型:pid_t fork();
返回值:PID,进程ID号。返回 0 表示子进程,返回-1失败,返回大于0的整数表示创建进程的PID。
可以通过getpid()来获取当前运行的进程ID,通过getppid()获取当前进程的父进程ID。

 

wait()

头文件:<sys/wait.h><sys/types.h>
函数原型:pid_t wait(int* status) status为空时表示忽略子进程退出时的状态,不为空表示保存子进程退出时的状态。
返回值:成功返回子进程的PID,失败返回-1
使进程进入阻塞状态。
直到任意子进程结束或者该进程接收到信号为止。
如果该进程没有子进程,或子进程已经结束。wait()会立即返回。
此函数时进程阻塞时父进程什么也不干。
该函数可以获取子进程终止使的退出状态。

 

waitpid()

函数原型:pid_t waitpid(pid_t pid, int *status, int options)

入参:pid

pid 传-1时 等待任意子进程与wait功能一样。
pid 传0时 等待其组ID等于调用进程的组ID的任意子进程。
pid 传 小于-1时 等待其组ID等于PID的绝对值的任意子进程。
入参:status 同wait

status 通过WIFEXITED宏来测验 子进程正常退出返回true,否则返回false

 

status 通过WEXITSTATUS宏 来查看退出状态值。 

 

return exit() _exit() 在WIFEXITED看来都算正常退出

入参:options

传0 同wait 阻塞父进程
传WNOHANG:若由PID指定的子进程并不立即可用,则waitpid不会被阻塞,此时返回值为0,子进程结束时返回子进程PID
返回值:正常返回结束的子进程PID,-1失败,

功能与wait类似。

可以指定等待某个子进程以及等待方式(阻塞或非阻塞)

wait和waitpid都可以实现对子进程资源的回收

exit(int status)
status:退出状态。
使进程终止,并清空缓冲区。

_exit(int status)
使进程终止,但是不会清空缓冲区。

 Exec函数族

以exec开头的一系列函数
该族函数提供了在一个进程中执行新的进程
通过fork开启的子进程中拥有与父进程相同的代码,但是开辟了新的空间,这么做实际意义不大。所以exec族函数可以对fork创建的子进程进行代码替换,只保留PID不变,这就实现了在一个进程中产生了新的进程。

 

参数意义
l(list)参数地址列表,以空指针结尾
v(vector)存有各参数地址的指针数组的地址
p(path)按 PATH 环境变量指定的目录搜索可执行文件
e(environment)存有环境变量字符串地址的指针数组的地址

守护进程

  1. 运行在后台的进程,与终端没有任何关系。
  2. 开机自启动,关机自关闭。

前台进程
和终端有关系的进程

后台进程
与终端脱离关系。

变成后台进程的步骤

  1. 首先变成孤儿进程。
  2. 让自己成为新的进程组组长。
  3. 让自己成为新的会话组组长。
  4. 使控制终端tty变成 ‘?’ 才能完全脱离终端。

 

创建守护进程的步骤

  1. 创建子进程父进程退出。(为了让子进程先被init收养)

  2. 创建新的会话组。(通过setsid()函数)让自己成为新的会话组组长。

 此时守护进程已经创建,但是还需要优化。再使用chdir()函数修改守护进程的工作路径。

重设文件掩码。将文件掩码设置为0可以增加守护进程的灵活性 

关闭父进程继承过来的文件描述符。因为守护进程用不到这些资源,会造成资源浪费。 

 

  1. getdtablesize()返回一个进程可以打开的最大文件数

  2. 再到/etc/rc.local 文件中exit 0之前 将这个守护进程的绝对路径写在这里。开机自启动。

 

相关文章:

C语言进程

什么是进程 什么是程序 一组可以被计算机直接识别的 有序 指令 的集合。 通俗讲&#xff1a;C语言编译后生成的可执行文件就是一个程序。 那么程序是静态还是动态的&#xff1f; 程序是可以被存储在磁盘上的&#xff0c;所以程序是静态的。 那什么是进程 进程是程序的执行过…...

C#基础(4)封装——成员方法

前言 我们在上一节学习了关于类的成员变量的使用&#xff0c;甚至也看到了相应的成员方法&#xff0c;我们可以将二者理解为类里面的变量和函数。 如果我这样说你肯定就能很快理解成员方法是什么作用了。 C#中设计成员方法的目的是为了将相关的功能代码组织在一起&#xff0…...

springbot,JWT令牌的使用。实现http请求拦截校验。

JWT 由三部分组成&#xff0c;用点&#xff08;.&#xff09;分隔 Header&#xff08;头部&#xff09; Payload&#xff08;负载&#xff09;Signature&#xff08;签名) 一、原理 Jwt原理其实很简单&#xff0c;在后端首先要有个拦截器&#xff0c;他会拦截所有http请求&…...

【SQL】DDL语句

文章目录 1.SQL通用语法2.SQL的分类3.DDL3.1数据库操作3.2 表操作3.2.1 表操作--数据类型3.2.2 表操作--修改3.2.3 表操作--删除 SQL 全称 Structured Query Language&#xff0c;结构化查询语言。操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库统一标准 。…...

【分页】Spring Boot 列表分页 + javaScript前台展示

后端&#xff1a; 准备好查询实体与分页实体 1、分页工具实体 package com.ruoyi.dms.config;import com.alibaba.nacos.api.model.v2.Result; import lombok.Data;import java.io.Serializable; import java.util.List;/*** author 宁兴星* description: 列表返回结果集*/ …...

「安装」 Windows下安装CUDA和Pytorch

「安装」 Windows下安装CUDA和Pytorch 文章目录 「安装」 Windows下安装CUDA和PytorchMac、Linux、云端Windows安装CUDA安装miniconda安装PyTorch测试总结 其他 Mac、Linux、云端 Mac、Linux、云端安装Miniconda和Pytorch的方法参考其他资料。 Windows 下面进行Windows下安装…...

c语言基础作业

选择题 1.1、以下选项中,不能作为合法常量的是 __________ A&#xff09;1.234e04 B&#xff09;1.234e0.4C&#xff09;1.234e4 D&#xff09;1.234e0 1.2、以下定义变量并初始化错误的是_____________。 A) char c1 ‘H’ &#xff1b; B) char c1 9…...

uniapp view增加删除线

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…...

[Day 83] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈在物聯網中的應用 區塊鏈技術與物聯網&#xff08;IoT&#xff09;結合&#xff0c;為許多領域提供了強大的解決方案。傳統的IoT架構常面臨數據隱私和安全問題&#xff0c;而區塊鏈的去中心化和加密技術則能有效增強IoT系統的安全性、透明性和效率。本文將探討區塊鏈如何…...

Java ReentrantLock

目录 1 互斥性 2 公平性 3 可重入性 4 获取和释放锁 5 尝试获取锁 6 可中断的锁定 7 条件变量 8 性能 9 使用场景 ReentrantLock 是 Java 提供的一种可重入的互斥锁&#xff0c;位于 java.util.concurrent.locks 包中&#xff0c;它实现了 Lock 接口。这个锁提供了与内…...

【Linux系统编程】第二十六弹---彻底掌握文件I/O:C/C++文件接口与Linux系统调用实践

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、回顾C语言文件接口 1.1、以写的方式打开文件 1.2、以追加的方式打开文件 2、初步理解文件 2.1、C文件接口 3、进一步理…...

数据分析-29-基于pandas的窗口操作和对JSON格式数据的处理

文章目录 1 窗口操作1.1 滑动窗口思想1.2 函数df.rolling2 JSON格式数据2.1 处理简单JSON对象和JSON列表2.1.1 处理简单的JSON结构2.1.2 处理空字段2.1.3 获取部分字段2.2 处理多级json2.2.1 展开所有级别(默认)2.2.2 自定义展开层级2.3 处理嵌套列表JSON3 参考附录1 窗口操作 …...

Ubuntu-WSL2一键设置代理操作

现状&#xff1a; Window11中拥有自己的代理软件 &#xff0c;可以科学上网已在WSL2中安装Ubuntu22.04 需求&#xff1a; Ubuntu-WSL2实现科学上网 实现&#xff1a; 参考&#xff1a;为 WSL2 一键设置代理 Linux 子系统中的网关指向的是 Windows&#xff0c;DNS 服务器指…...

ubuntu命令行连接wifi

在Ubuntu上&#xff0c;你可以通过命令行连接到Wi-Fi网络。以下是详细步骤&#xff0c;主要使用 nmcli 和 nmtui 命令。 方法 1&#xff1a;使用 nmcli nmcli 是 NetworkManager 的命令行界面&#xff0c;用于管理网络连接。以下是使用 nmcli 连接到 Wi-Fi 网络的步骤&#x…...

日常工作第10天:

vim 批量编辑的命令是 移动光标到列首。按键 CtrlV 进入 Visual block 模式&#xff0c;标记你想要进行编辑的列&#xff08;HJKL可以向左下上右移动光标&#xff09;。按键 ShiftI 进入 Insert 模式&#xff0c;在列首输入文本&#xff1b;或者 Shift A&#xff0c;追加文本…...

CNN+Transformer解说

CNN&#xff08;卷积神经网络&#xff09;和Transformer是两种在深度学习领域广泛使用的模型架构&#xff0c;它们在处理不同类型的数据和任务时各有优势。 CNN擅长捕捉局部特征和空间层次结构&#xff0c;而Transformer擅长处理序列数据和长距离依赖关系。 将CNN与Transform…...

jmeter中token测试

案例&#xff1a; 网站&#xff1a;http://shop.duoceshi.com 讲解&#xff1a;用三个接口来讲解 第一个接口code&#xff1a;GET http://manage.duoceshi.com/auth/code 第二个登录接口&#xff1a;http://manage.duoceshi.com/auth/login 第三个接口&#xff1a;http://…...

基于解压缩模块的JPEG同步重压缩检测论文学习

一、论文基本信息&#xff1a; 论文题目&#xff1a;基于解压缩模块的JPEG同步重压缩检测 作者&#xff1a;王金伟1 &#xff0c;胡冰涛1 &#xff0c;张家伟1 &#xff0c;马 宾2 &#xff0c;罗向阳3 &#xff08;1.南京信息工程大学计算机学院、网络空间安全学院&#xf…...

音视频入门基础:FLV专题(7)——Tag header简介

一、引言 从《音视频入门基础&#xff1a;FLV专题&#xff08;3&#xff09;——FLV header简介》中可以知道&#xff0c; 在FLV header之后&#xff0c;FLV文件剩下的部分应由PreviousTagSize和Tag组成。FLV文件 FLV header PreviousTagSize0 Tag1 PreviousTagSize1 Ta…...

【Linux 报错】“make: ‘xxxx‘ is up to date.” 解决办法

一、报错原因 我们使用 make 命令&#xff0c;想要将 text.c 文件编译形成 可执行文件 text 时&#xff0c;报错如下 make: test is up to date. 中文含义&#xff1a;test 文件已经达到最新状态 意思是&#xff1a; test.c 文件里面的 所有源代码都没有修改过&#xff0c;你…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...