Linux进程

 

一.进程和程序 

·程序
程序(program)是存放在磁盘文件中的可执行文件

·进程
程序的执行实例被称为进程(process)
进程具有独立的权限与职责。如果系统中某个进程崩溃,它不会影响到其余的进程。
每个进程运行在其各自的虚拟地址空间中,进程之间可以通过由内核控制的机制相互通讯。
·进程ID
每个linux进程都一定有一个唯一的数字标识符,称为进程ID(process
lD),进程ID总是一非负整数。PID

task_struct----->结构体------>进程控制块 

 

 二.C程序启动过程

内核启动特殊例程

启动例程 
在进程的main函数执行之前内核会启动

该例程放置在/lib/libc.so.**中 在进程的Main函数执行之前内核会启动该例程放置在/lib/libc.so.**中
编译器在编译时会将启动例程编译进可执行文件中启动例程作用 编译器在编译时会将启动例程编译进可执行文件中启动例程作用
搜集命令行的参数传递给main函数中的argc和argv

搜集环境信息构建环境表并传递给main函数
登记进程的终止函数 登记进程的终止函数

正常终止:
从main函数返回
调用exit(标准c库函数)

调用_exit或_Exit(系统调用)

最后一个线程从其启动例程返回

最后一个线程调用pthread_exit

异常终止:
调用abort
接受到一个信号并终止
最后一个线程对取消请求做处理响应进程返回

进程返回:
通常程序运行成功返回0,否则返回非0。

在shell中可以查看进程返回值(echo $?) 

 2.1登记终止函数

参数为一个无返回值,无参数的函数指针。

每个启动的进程都默认登记了一个标准的终止函数

终止函数在进程终止时释放进程所占用的一些资源

登记的多个终止函数执行顺序是以栈的方式执行,先登记的后执行。

 _exit不调用终止函数

 

 ●进程常见状态:
运行状态
系统当前进程

就绪状态进程
ps命令的STAT列为值R

等待状态
等待事件发生

等待系统资源

分为可中断的等待和不可中断的等待
 ps命令的STAT列为值S(可中断)D(不可中断)

停止状态
ps命令的STAT列为值T

僵尸状态
进程终止或结束
在进程表项中仍有记录ps命令的STAT列为值Z

三.进程调度

分时系统,分配时间片

●第一步:处理内核中的工作

●第二步:处理当前进程

●第三步:选择进程
实时进程
普通进程
●第四步:进程交换

 四.进程标识

#include <unistd.h>
#include <sys/types.h>

pid_t getpid(void):  获得当前进程lD
uid_t getuid(void):获得当前进程的实际用户ID
uid_t geteuid(void):获得当前进程的有效用户ID
gid_t getgid(void):获得当前进程的用户组ID
pid_t getppid(void):获得当前进程的父进程ID
pid_t getpgrp(void):获得当前进程所在的进程组ID
pid_t getpgid(pid_t pid):获得进程ID为pid的进程所在的进程组ID

五.进程创建 

#include <sys/types.h>

#include <unistd.h>
pid_t  fork(void);
返回:子进程中为0,父进程中为子进程ID,出错为-1

pid_t  vfork(void);
返回:子进程中为0,父进程中为子进程ID,出错为-1

fork创建的新进程被称为子进程,该函数被调用一次,但返回两次。两次返回的区别是:在子进程中的返回值是0,而在父进程中的返回值则是新子进程的进程ID。

创建子进程,父子进程哪个先运行根据系统调度,且复制父进程的内存空间。 制父进程的内存空间.
vfork创建子进程,但子进程先运行且不复制父进程的内存空间。 创建子进程,但子进程先运行且不复制父进程的内存空间.

fork()的子进程会继承父进程的一些信息

·子进程的继承属性
用户信息和权限、目录信息、信号信息、环境、共享存储段、资源限制、堆、栈和数据段,共享代码段。
·子进程特有属性
进程ID、锁信息、运行时间、未决信号

操作文件时的内核结构变化
子进程只继承父进程的文件描述表,不继承共享文件表项和i-node。

父进程创建一个子进程后,文件表项中的引用计数器加1变成2,当父进程作close操作后,计数器减1,子进程还是可以使用文件表项,只有当计数器为0时才会释放文件表项。

 

 子进程也复制父进程的缓存区

 

继承父进程的文件描述表,不继承共享文件表项和i-node。  

 两个进程分别创建一个文件

 进程表项大多不复制

 六.进程链和进程扇

6.1进程链

代码实例: 

#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{int count=0;pid_t pid=0;if(argc<2){count=2;}else{count=atoi(argv[1]);}for(int i=1;i<count;++i){pid=fork();if(pid<0){perror("pid");exit(-1);}else if(pid>0) break;  //父进程退出}if(pid>0) wait(NULL);printf("PID:%d  PPID:%d\n",getpid(),getppid());return 0;
}

 6.2进程扇

 代码实例:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{int count=0;pid_t pid=0;if(argc<2){count=2;}else{count=atoi(argv[1]);}for(int i=1;i<count;++i){pid=fork();if(pid<0){perror("pid");exit(-1);}else if(pid==0) break;}if(pid>0) wait(NULL);printf("PID:%d  PPID:%d\n",getpid(),getppid());return 0;
}

七.僵尸进程

僵尸进程:

子进程结束但是没有完全释放内存(在内核中的task_struct没有释放),该进程就成为僵尸进程。当僵尸进程的父进程结束后就会被init进程领养,最终被回收。
避免僵尸进程:
1.让僵尸进程的父进程来回收,父进程每隔一段时间来查询子进程是否结束并回收,调用wait()或者waitpid(),通知内核释放僵尸进程。

2.采用信号SIGCHLD通知处理,并在信号处理程序中调用wait函数。、

3.让僵尸进程成为孤儿进程,由init进程回收。

 &后台运行           

八.守护进程和孤儿进程     

8.1守护进程

·守护进程(daemon)是生存期长的一种进程。它们常常在系统引导装入时起动,在系统关闭时终止。

·所有守护进程都以超级用户(用户ID为O)的优先权运行。·

·守护进程没有控制终端 
·守护进程的父进程都是init进程

 8.2孤儿进程

父进程结束,子进程就成为孤儿进程,会由1号进程( init进程)领养。

 九.wait函数

#include <sys/types.h>

#include <sys/wait.h>
pid_t wait(int *status);
返回:成功返回子进程ID,出错返回-1
功能:等待子进程退出并回收,防止僵尸进程产生

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

返回:成功返回子进程ID,出错返回-1
功能: wait函数的非阻塞版本
wait和waitpid函数区别
在一个子进程终止前,wait使其调用者阻塞waitpid有一选择项,可使调用者不阻塞。
waitpid等待一个指定的子进程,而wait等待所有的子进程,返回任一终止子进程的状态。
 

 

 十.exec函数族

在用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序。
当进程调用一种exec函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。

exec系列函数的注意点
1.execve函数为系统调用,其余为库函数。执行execve函数后面的代码不执行。
2.execlp和execvp函数中的pathame,相对和绝对路径均可使用,其它四函数中的pathname只能使用绝对路径。相对路径一定要在进程环境表对应的PATH中。
3.argv参数为新程序执行main函数中传递的argv参数,最后一个元素为NULL。
4.envp为进程的环境表

 ●六个函数的都是以“exec”四个字母开头的,后面的字母表示了其用法上的区别:
1、带有字母“I”的函数,表明后面的参数列表是要传递给程序的参数列表,参数列表的第一个参数必须是要执行程序,最后一个参数必须是NULL。

2.带有字母“p”的函数,第一个参数可以是相对路径或程序名,如果无法立即找到要执行的程序,那么就在环境变量PATH指定的路径中搜索。其他函数的第一个参数则必须是绝对路径名。
3.带有字母“v”的函数,表明程序的参数列表通过一个字符串数组来
传递。这个数组和最后传递给程序的main函数的字符串数组argv完全一样。第一个参数必须是程序名,最后一个参数也必须是NULL。

4.带有字母“e”的函数,用户可以自己设置程序接收一个设置环境变量的数组。

十一.system函数 

 可以是绝对路径,也可以是绝对路径

 system函数内部构建一个子进程,由子进程调用exec函数。
等同于/bin/bash -c "cmd"或者exec("bash","-c" ,"cmd");

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件系统的需求整理方法

软件系统的需求整理是项目的关键阶段之一&#xff0c;它涉及识别、收集和组织软件系统的需求。以下是一些常见的软件系统需求整理方法&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.需求收集会议&…

windows系统使用软件异地同步数据(灾备)

Syncthing是一个开源文件同步工具&#xff0c;可以在多台设备之间实时同步文件或文件夹&#xff0c;官方网站&#xff1a;Syncthing 下载地址&#xff1a;Syncthing | Downloads &#xff0c;一般推荐下载图形界面SyncTrayzor。 官方下载地址&#xff1a; https://github.c…

【Vue】快速入门和生命周期

目录 前言 一、vue的介绍 1. Vue.js是什么&#xff1f; 2. 库和框架的区别 3.基本概念和用法&#xff1a; 二、MVVM的介绍 1. 什么是MVVM&#xff1f; 2. MVVM的组成部分 3. MVVM的工作流程 4. MVVM的优势 5. MVVM的应用场景 三、vue实例 1.模板语法&#xff1a; …

Vue3+vite 使用import.meta.globEager代替require.context实现自动导入api

webpack require.context实现自动导入 Vite方式实现自动导入步骤 1、在src下会有一个api文件夹&#xff0c;结构如下&#xff1a; 2、通常情况下&#xff0c;api文件夹的index.js文件我们通常是这样来引入的 import * as login from ./modules/login import * as system fro…

【C++】泛型算法(二)泛型指针Iterator(迭代器)

迭代器iterator定义 迭代器是一种检查容器内元素并遍历元素的数据类型&#xff1b;迭代器提供一个对容器对象或者string对象的访问方法&#xff0c;并定义了容器范围&#xff1b;迭代器的使用可以提高编程的效率。 其定义应该提供&#xff1a; 迭代对象&#xff08;某个容器&a…

科技云报道:云安全的新战场上,如何打破“云威胁”的阴霾?

科技云报道原创。 近年来&#xff0c;在云计算和网络安全产业的蓬勃发展下&#xff0c;我国云安全行业市场规模呈现高速增长态势&#xff0c;在网络安全市场总体规模中占比不断上升。 据统计&#xff0c;近5年我国云安全市场保持高速增长&#xff0c;2021年我国云安全市场规模…

Linux(下)

一、 对netstat的补充 1.进程管理 在杀死进程时&#xff0c;不可以杀死其他用户的进程。 查看指定进程时&#xff0c;下图的第二行 是ps -ef | grep tail 命令执行的进程 kill -9 进程号 也可以写作 kill -s 9 进程号 机器人&#xff1a; 2.查看主机状态 2.1 top命令&…

uniapp——实现聊天室功能——技能提升

这里写目录标题 效果图聊天室功能代码——html部分代码——js部分代码——其他部分 首先声明一点&#xff1a;下面的内容是从一个uniapp的程序中摘录的&#xff0c;并非本人所写&#xff0c;先做记录&#xff0c;以免后续遇到相似需求抓耳挠腮。 效果图 聊天室功能 发送图片 …

【WFA】【Enhanced open】CT_OWE_DHgroup_STA_NoAssociation-AllGroupsRejected_10338_1

测试报告如下: Fail的关键log: 当连接到ap失败时,驱动程序将尝试连接到ap。如果ap仅支持Group 20,并且sta支持Group 19、20。sta将首先尝试Group 19,ap将通过状态代码77拒绝它。然后驱动程序将尝试连接Group 19的ap,仍然达到最大重试次数。那么sta将尝试第Group 20 。 …

Docker入门,Docker是什么?有什么用?该怎么用?

目录 1. 项目部署时的复杂性&#xff1f; 2. Docker是如何解决依赖兼容问题的&#xff1f; 3. 众多Linux操作系统发行版的区别 4. Docker 是如何实现跨系统运行的&#xff1f; 5. Docker与虚拟机的差别 6. 镜像(Image)与容器(Container) 7. DockerHub 8. Docker 架构 …

Matlab图像处理-强度分层法

强度分层法 强度分层技术是最简单的伪彩色图像处理方法之一。 如果将一幅图像被描述为空间坐标(x,y) 的强度函数f(x,y) &#xff0c;则分层的方法可以看作是将一些平面平行于图像坐标平面(x,y) &#xff0c;然后将每个平面在相交区域切割图像函数。下图展示了使用平面将图像函…

时序预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测

时序预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测 目录 时序预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元时间序列预测。…

项目--苍穹外卖

1.| constant | 存放相关常量类 | | context | 存放上下文类 | | enumeration | 项目的枚举类存储 | | exception | 存放自定义异常类 | | json | 处理json转换的类 | | properties | 存放SpringBoot相关的配置属性类 | | result | 返回结果类的封装 | | utils | 常用工具类 | …

Linux工具(一)

前言&#xff1a;Linux是一个开源的操作系统&#xff0c;它拥有庞大而活跃的开发社区&#xff0c;为用户提供了丰富多样的工具和应用程序。这些工具不仅适用于系统管理员和开发人员&#xff0c;也适用于普通用户&#xff0c;可以帮助他们完成各种任务&#xff0c;从简单的文件管…

宝塔面板日志和缓存占用磁盘空间很大,如何清理?

服务器使用的宝塔面板&#xff0c;最近发现服务器的“系统盘”快爆满了&#xff0c;点面板上日志管理都要收费&#xff0c;我也不是很懂服务器的运维&#xff0c;使用ai进行询问&#xff0c;得到了解决&#xff1a; /var/log 日志目录 运行下面的命令查找是哪些目录占用空间很…

嵌入式Linux驱动开发(I2C专题)(七)

使用GPIO操作I2C设备_IMX6ULL 参考资料&#xff1a; Linux文档 Linux-5.4\Documentation\devicetree\bindings\i2c\i2c-gpio.yamlLinux-4.9.88\Documentation\devicetree\bindings\i2c\i2c-gpio.txt Linux驱动源码 Linux-5.4\drivers\i2c\busses\i2c-gpio.cLinux-4.9.88\driv…

【SpringMVC】文件上传与下载、JREBEL使用

目录 一、引言 二、文件的上传 1、单文件上传 1.1、数据表准备 1.2、添加依赖 1.3、配置文件 1.4、编写表单 1.5、编写controller层 2、多文件上传 2.1、编写form表单 2.2、编写controller层 2.3、测试 三、文件下载 四、JREBEL使用 1、下载注册 2、离线设置 一…

Java增强for循环(学习笔记)

Java增强for循环 主要用于数组或者集合的增强型for循环。 格式&#xff1a; for(声明语句&#xff1a;表达式){ 代码句子 } 声明语句&#xff1a;声明新的局部变量&#xff0c;该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块&#xff0c;其值与此时数组元…

Python 变量作用域

视频版教程 Python3零基础7天入门实战视频教程 在程序中定义一个变量时&#xff0c;这个变量是有作用范围的&#xff0c;变量的作用范围被称为它的作用域。根据定义变量的位置&#xff0c;变量分为两种。 局部变量。在函数中定义的变量&#xff0c;包括参数&#xff0c;都被称…

王道考研操作系统

王道考研操作系统 计算机系统概述操作系统的概念操作系统的特征操作系统的发展历程操作系统内核中断和异常![在这里插入图片描述](https://img-blog.csdnimg.cn/162452b4c60144e0bd500e180127c447.png)系统调用操作系统结构虚拟机错题 进程与线程进程控制进程通信线程和多线程模…