从零开始学习Linux(6)----进程控制

news2025/1/19 20:36:27

1.环境变量

        环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,我们在编写C/C++代码时,链接时我们不知道我们链接的动态静态库在哪里,但可以连接成功,原因是环境变量帮助编译器进行查找,环境变量通常具有某些特殊用途,还有在系统当中中通常具有全局特性。

        环境变量不是一个而是一堆,彼此之间其实没有关系。

        环境变量一般是系统内置的具有特殊作用的变量。

        定义变量的本质,其实是开辟空间,在运行期间我们的程序也能开辟空间,操作系统/bash是用C语言写的程序,它能在运行中开辟空间,系统的环境变量,本质就是系统自己开辟空间,给他名字和内容即可。

1.命令行参数

int main(int argc,char *argv[],char *env[])

#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
    if(argc!=2)
    {
        printf("Usage:\n\t%s -number[1-3]\n",argv[0]);
        return 1;
    }
    if(strcmp("-1",argv[1])==0)
    {
        printf("function 1\n");
    }                                                     
    else if(strcmp("-2",argv[1])==0)
    {
        printf("function 2\n");
    }
    else if(strcmp("-3",argv[1])==0)
    {
        printf("function 3\n");
    }
    else
    {
        printf("unknown!\n");
    }
}

        我们可以通过不同的选项,让我们的同一个程序执行它内部不同的功能。命令行参数时Linux指令的基础。

        在上面的演示中,为什么我们不能像ls命令一样执行而是./的方式来执行,这时需要将你的程序所在的路径添加到环境变量中。

        指令env查看系统所有环境变量。命令行参数env[]中存放的也是系统所有环境变量,export命令导入环境变量。环境变量是可以被子进程继承下去的!(方式1),环境变量具有全局属性,会被所有的子进程继承。还可通过第三方变量environ,和getenv方法来获取。本地变量只能bash内部有效。

2.程序地址空间

        子进程按照父进程为模版,父子并没有对变量进行任何修改,如果子进程先修改,完成之后父进程再读取,我们发现父子进程输出地址是一致的,但是变量内容不一样,所以:

        变量内容不一样,所以父子进程输出的变量绝对不是同一个变量但地址值是一样的,说明,该地址绝对不是物理地址! 在Linux地址下,这种地址叫做 虚拟地址,我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理。OS必须负责将 虚拟地址 转化成 物理地址 。
        同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了
不同的物理地址。

1.什么是地址空间

        进程地址空间,每一个进程,都会存在一个进程地址空间,32【0,4GB】;进程地址空间是数据结构,就是特点数据结构的对象。区域划分本质就是区域内的各个地址,都可以使用,我们的地址空间不具备对我们的代码和数据的保存能力,将地址空间上的地址转化到物理内存中,给我们的进程提供一张映射表---页表。

2.为什么要有地址空间+页表

        将物理内存从无序变有序,让进程以统一的视角看待内存。

        将进程管理和内存管理进行解耦合。

        地址空间+页表是保护内存安全的重要手段。

​​​​​​ 1.写时拷贝

        进程调用fork,当控制转移到内核中的fork代码后,内核做:

  • 分配新的内存块和内核数据结构给子进程
  • 将父进程部分数据结构内容拷贝至子进程
  • 添加子进程到系统进程列表当中
  • fork返回,开始调度器调度

        通常,父子代码共享,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本。所以,fork之前父进程独立执行,fork之后,父子两个执行流分别执行。

3.进程终止

        main函数的返回值叫做进程的退出码,一般0,表示进程执行成功,非零表示失败,不同的数字表示不同的错误原因。可以通过echo $?查看进程退出码。

        错误码转化为错误描述:1.可以使用系统自带的。2.自定义。除了进程退出,函数退出,我们怎么知道函数的执行情况。函数有返回值,调用函数,我们通常想看到两种结果:1.函数的执行结果。2.函数的执行情况--成功,失败,原因。

        进程退出的场景就三种:1.代码执行完,结果是正确的。2.代码执行完,结果是不正确的。3.进程代码没有执行完,进程出异常了(是进程收到了异常信号,每个信号都有不同的编号,不同的信号编号表明异常的原因)。

        任何进程最终的执行情况,我们可以使用两个数字表明具体执行的情况。

        exit就是用来终止进程的。exit(退出码)在我们的进程代码中,任意地方调用exit,都表示进程退出,exit会支持刷新缓冲区,_exit不支持,我们之前所说的缓冲区绝对不是操作系统里面的缓冲区,而是上层的库的缓冲区。

4.进程等待

  • 之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。
  • 另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。

1.父进程通过wait方式,回收子进程的资源(必然)

2.通过wait方式,获取子进程的退出信息(可选的)

wait默认会进行阻塞等待,等待任意一个子进程,返回值>0:等待成功,等待子进程的pid,<0:等待失败。

pid_t wait(int*status);
返回值:
成功返回被等待进程pid,失败返回-1。
参数:
输出型参数,获取子进程退出状态,不关心则可以设置成为NULL
waitpid
pid_ t waitpid(pid_t pid, int *status, int options);
返回值:
        当正常返回的时候waitpid返回收集到的子进程的进程ID;
        如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
        如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
参数:
        pid:
                Pid=-1,等待任一个子进程。与wait等效。
                Pid>0.等待其进程ID与pid相等的子进程。
        status:
                WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)
                WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)
        options:
                WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进 程的ID。
  • 如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退出信息。
  • 如果在任意时刻调用wait/waitpid,子进程存在且正常运行,则进程可能阻塞。
  • 如果不存在该子进程,则立即出错返回。
获取子进程status
  • wait和waitpid,都有一个status参数,该参数是一个输出型参数,由操作系统填充。
  • 如果传递NULL,表示不关心子进程的退出状态信息。
  • 否则,操作系统会根据该参数,将子进程的退出信息反馈给父进程。
  • status不能简单的当作整形来看待,可以当作位图来看待(只研究status低16比特位.

5.进程程序替换

1.替换原理

        什么是程序替换:

                a.我们的程序,只能执行我们的代码。

                b.如果我们创建的子进程,想执行其他程序的代码呢?

        在替换过程中,有没有创建新的进程???没有!

        用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行,调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。

2.替换函数

        有六种以exec开头的函数,统称为exec函数:

#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
        这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。
        如果调用出错则返回-1
        所以exec函数只有出错的返回值而没有成功的返回值
l(list) : 表示参数采用列表
v(vector) : 参数用数组
p(path) : 有p自动搜索环境变量PATH
e(env) : 表示自己维护环境变量
        更改为多进程版本,我们为什么要这么做:父进程能得到执行结果。
        替换为什么没有影响父进程:进程具有独立性,替换的时候,发生写时拷贝。
        默认可以通过地址空间继承的方式,让所以得子进程拿到环境变量
        进程程序替换,不会替换环境变量数据
1.如果我们想让子进程继承全部的环境变量,直接能拿到
2.如果单纯的新增呢?putenv
3.如果我想设置全新的环境变量给子进程呢?

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

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

相关文章

Spring Boot + Mybatis-plus代码生成器 自动生成项目结构

首先创建一个新的springboot项目 项目初始化结构如下&#xff1a; 运行自动生成结构代码后的效果如下&#xff1a; 对比初始化项目结构可以发现结构中多了以下几个部分; controller文件夹存储接口类mapper文佳夹存储数据库映射model文件夹存储数据库模型类Service文件夹存储业…

在做题中学习(58):和为K的子数组

560. 和为 K 的子数组 - 力扣&#xff08;LeetCode&#xff09; 因为是判断子数组的和 要返回 k 的次数&#xff0c;所以 解法&#xff1a;前缀和 哈希表 提出一个概念&#xff1a;以下标i为结尾的所有子数组 那要找出所有和 k的子数组 就相当于&#xff1a;找出所有值为…

OpenAI发布最新的人工智能模型GPT-4o:可实时语言、图像交互

OpenAI 在周一宣布了一款新的旗舰生成式 AI 模型&#xff0c;他们将其称为 GPT-4o — 这里的 “o” 意指 “全方位”&#xff0c;指的是该模型处理文本、语音和视频的能力。GPT-4o 将会在接下来的几周逐步在公司的开发者和消费者产品中推出。 OpenAI 首席技术官米拉穆拉蒂表示…

Allegro如何输出各层PCB视图的PDF文件

如何输出各层PCB视图的PDF文件 1、说明 用Allegro设计好PCB后&#xff0c;有时需要出各层的PDF文档出来进行汇报和展示&#xff0c;这时就需要将各层的平面视图全部以PDF的形式加载出来&#xff0c;具体方法如下。 2、PDF文件的输出方法&#xff08;以四层板为例&#xff09; …

微信小程序的设计与实现

微信小程序的设计与实现 目录 1.系统简述&#xff1a; 2.开发工具及相关技术&#xff1a; 2.1 HTML、WXSS、JAVASCRIPT技术 2.2 Vanilla框架 2.3 uni-app框架 2.4 MYSQL数据库 3.工程结构及其说明&#xff1a; 4.主要功能展示 4.1登录 4.2 注册 4.3 首页…

腾讯宣布混元文生图大模型开源: Sora 同架构,可免费商用

5月14日&#xff0c;腾讯宣布旗下的混元文生图大模型全面升级并对外开源&#xff0c;目前已在 Hugging Face 平台及 Github 上发布&#xff0c;包含模型权重、推理代码、模型算法等完整模型&#xff0c;可供企业与个人开发者免费商用。 这是业内首个中文原生的DiT架构文生图开…

排序1——直接插入排序,希尔排序,选择排序,堆排序

1.排序的概念及其运用 1.1排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录…

组合商标申请如何风控提高通过率!

最近一个老客户找到普推知产老杨&#xff0c;说要申请注册一个新的商标&#xff0c;是一个组合商标&#xff0c;有图形&#xff0c;两行文字&#xff0c;一行文字的拼音&#xff0c;还有三个字母的简称&#xff0c;组合商标在申请时会进行拆分审查&#xff0c;图形、文字、拼音…

C++干货--引用

前言&#xff1a; C的引用&#xff0c;是学习C的重点之一&#xff0c;它与指针的作用有重叠的部分&#xff0c;但是它绝不是完全取代指针(后面我们也会简单的分析)。 引用的概念&#xff1a; 引用 不是新定义一个变量 &#xff0c;而 是给已存在变量取了一个别名 &#xf…

Rust学习笔记(中)

前言 笔记的内容主要参考与《Rust 程序设计语言》&#xff0c;一些也参考了《通过例子学 Rust》和《Rust语言圣经》。 Rust学习笔记分为上中下&#xff0c;其它两个地址在Rust学习笔记&#xff08;上&#xff09;和Rust学习笔记&#xff08;下&#xff09;。 错误处理 pani…

中北大学软件学院javaweb实验三JSP+JDBC综合实训(一)__数据库记录的增加、查询

目录 1.实验名称2.实验目的3.实验内容4.实验原理或流程图5.实验过程或源代码&#xff08;一&#xff09;编程实现用户的登录与注册功能【步骤1】建立数据库db_news2024和用户表(笔者使用的数据库软件是navicat)【步骤2】实现用户注册登录功能(与上一实验报告不同的是&#xff0…

LeetCode2215找出两数组的不同

题目描述 给你两个下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;请你返回一个长度为 2 的列表 answer &#xff0c;其中&#xff1a;answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整数组成的列表。answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整数组…

Kafka基础架构详解

Kafka基础架构 Kafka概述 1. Producer&#xff08;生产者&#xff09;&#xff1a; 生产者是向 Kafka broker 发送消息的客户端。它负责将消息发布到指定的主题&#xff08;Topic&#xff09;&#xff0c;并可以选择将消息发送到特定的分区&#xff08;Partition&#xff09…

vwmare虚拟机迁移磁盘方法

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理 虚拟机迁移磁盘的方法 简单方便快上手 当前目标 当前迁移文件: 当前位置&#xff1a; 目的地: e盘虚拟机文件夹 迁移到当前目录。 实际操作 先打开虚拟机的设置&#xff0c;找到这个虚拟机当前的位置…

手机微信备份:防止数据丢失的明智之举

我们通过微信聊天、支付、购物等方式与他人进行交流和互动&#xff0c;而这些聊天记录和文件也成为了我们重要的数据资源。为了防止数据丢失给我们带来的不便和损失&#xff0c;手机微信备份成为了一项非常重要的任务。本文将为您介绍如何有效地备份手机微信数据&#xff0c;确…

windows和 Linux 下通过 QProcess 打开ssh 和vnc

文章目录 SSHSSH验证启动SSH一、口令登录二、公钥登录通过Qprocess 启动ssh VNC Viewer简介通过QProcess启动vncViewer SSH Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的**安全网络协议**。它是专为远程登录会话(**甚至可以…

centos7安装zabbix-server

zabbixan-server安装 环境安装zabbix安装zabbix配置apachezabbix-UI前端配置修改zabbix为中文语言 环境 准备&#xff1a; centos7系统、mysql数据库/MariaDB数据库 mysql数据库可参照&#xff1a;https://blog.csdn.net/weixin_61367575/article/details/138774428?spm1001.…

网站设计模板简单又好看

在互联网时代&#xff0c;每个企业都需要拥有一个好看又具有吸引力的网站。一个简单却又好看的网站设计模板可以为企业带来许多好处。本文将探讨一些如何设计一个简单又好看的网站模板的技巧。 首先&#xff0c;一个好的网站设计模板应该具备简洁明了的布局。简单的布局能够使用…

有哪些值得买的开放式耳机推荐?2024年开放式运动耳机选购指南

开放式耳机因其独特设计&#xff0c;能在一定程度上保护听力。相较于传统封闭式耳机&#xff0c;开放式设计允许周围环境声音自然流入耳内&#xff0c;降低了耳内共振和声压&#xff0c;减少了耳道的不适感&#xff0c;从而减轻了对听力的潜在损害。对于追求音质与听力保护并重…

项目经理之路:裁员与内卷下的生存策略

作为一名项目经理&#xff0c;身处这个充满挑战与机遇的行业中&#xff0c;今年所面临的裁员潮和内卷化趋势无疑给我的工作带来了前所未有的压力。然而&#xff0c;正是这些压力和挑战&#xff0c;让我们更加深刻地思考了在这个快速变化的时代中&#xff0c;我们项目经理应该如…