Linux编程中进程的概念和环境变量

目录

概述

1 认识进程

1.1 进程的定义

1.2 进程状态

1.3 进程的调用

2 进程环境

2.1 进程ID

2.2 父进程与子进程

2.3 UID 和 GID

2.4 环境变量

2.4.1 通过main函数参数获取环境变量

2.4.2 environ 全局变量获取环境变量

2.4.3 getenv()函数获取环境变量

2.5 环境变量的作用

3 参考文献


概述

        本文介绍linux编程中进程的概念,还介绍了进程环境的一些知识,以及如何查询环境变量中参数方法。

1 认识进程

1.1 进程的定义

         进程(process) 是一个已经开始执行但还没终止的程序实例。 Linux 系统下使用 ps 命令可以查看到当前正在执行的进程。每个进程包含有进程运行环境、内存地址空间、进程ID、和至少一个被称为线程的执行控制流等资源。同一个程序可以实例化为多个进程实体。操作系统中所有进程实体共享着计算机系统的 CPU、外设等源。

1.2 进程状态

Linux 是一个多用户多任务的操作系统,可以同时运行多个用户的多个程序,就必然会产生多进程,而每个进程都会有不同的状态。 Linux 的进程有以下 6 种状态:

状态描述
D不可中断的深度睡眠状态,处于这种状态的进程不能响应异步信号;
R进程处于运行态或就绪状态, 只有在该状态的进程才可能在 CPU 上运行。而同一时刻可能有多个进程处于可执行状态;
S可中断的睡眠状态,处于这个状态的进程因为等待某种事件的发生而被挂起
T暂停状态或跟踪状态
X退出状态,进程即将被销毁
Z退出状态,进程成为僵尸进程

进程的状态转换图如下:

Linux 系统使用“ps -aux”命令时可观察到进程的当前状态

ps -aux

1.3 进程的调用

进程创建后通常要调用 exec 族函数来装载程序文件的可执行映像,并在完成装载后调用程序的 main()函数。在 C 程序中, main()函数通常是程序的执行起始点,有 3 种原型定义:

int main();                                    /* 原型 1 */
int main(int argc, char *argv[]);              /* 原型 2 */
int main(int argc, char *argv[], char *env[]); /* 原型 3 */

函数参数介绍

参数介绍
argc命令行参数的个数
argv[]指向参数的各个指针所构成的数组
env[]环境变量字符串的数组

2 进程环境

2.1 进程ID

每个进程在创建时,内核都会为之分配一个进程 ID(Process ID,简称 PID)用来标识当前的进程,进程 ID 是一个类型为 pid_t 的整数,并保持同一时刻是唯一值,它最大值为pid_max 值(默认为 32768,可修改)。当进程退出时,它的进程 ID 可回收循环使用。

Linux 系统 getpid()函数可以获取当前进程的进程 ID。 getpid()函数原型如下:

#include <unistd.h>
pid_t getpid(void);

Linux环境下查看进程PID,使用如下命令:

ps -ef

2.2 父进程与子进程

进程创建时,创建进程为新进程的父进程,新进程是创建进程的子进程。在子进程中可 以使用 getppid()函数获取父进程的 PID, getppid()函数原型如下:

#include <unistd.h>
pid_t getppid(void);

Linux 使用进程间的父子关系将所有系统进程组织为一棵树形结构,其中 init 进程为所 有进程的根节点。

使用命令,查看Linux进程结构:

 pstree 

2.3 UID 和 GID

Linux 是一个多用户的操作系统,每个用户至少有一个用户 ID(User ID,简称 UID)及用户组 ID(Group ID,简称 GID) 。 Linux 系统有严格的权限管理,每个用户有不同的权限,如 root 用户拥有访问所有系统资源的权限。当执行一个程序时,该程序将获取当前用户的 UID 及 GID 作为进程的权限。

使用 id 命令可以列出当前用户的 id:

id root

2.4 环境变量

进程在运行过程中可以通过以下 3 种方式来获取运行环境的环境变量: 1)通过 main()函数的第 3 个参数 env 获取; 2)通过 environ 全局变量获取; 3)通过 getenv()函数获取。

查询linux环境下的环境变量:

env

2.4.1 通过main函数参数获取环境变量

main()的原型的第三个参数为环境变量字符串的指针数组,数组最后一个元素为 NULL。下面看一个具体的实例:

#include <stdio.h>
​
int main(int argc, char * argv[], char *env[]) 
{
    int i = 0;
    
    while (env[i])
     puts(env[i++]);
    
    return 0;
}

2.4.2 environ 全局变量获取环境变量

在加载进程的时候,系统会为每一个进程复制一份系统环境变量的副本, 并保存在全局变量environ中。下面看一个具体的实例:

#include <stdio.h>
​
extern char ** environ;
​
int main(int argc, char * argv[]) 
{
    int i = 0;
    
    while (environ[i])
        puts(environ[i++]);
        
    return 0;
}

2.4.3 getenv()函数获取环境变量

Linux 系统提供 getenv()、 setenv()等函数来操作环境变量,getenv()函数的原型如下:

#include <stdlib.h>
char *getenv(const char *name);

参数 name 是要获取的环境变量名,返回值为该变量的值。以下代码可以获取环境变量HOME 的值:

char* env;
env = getenv("HOME");

2.5 环境变量的作用

        环境变量常见的用途之一是在 shell 中, 每一个环境变量都有它所表示的含义,譬如 HOME 环境变量表示用户的家目录, USER 环境变量表示当前用户名, SHELL 环境变量表示 shell 解析器名称, PWD 环境变量表示当前所在目录等, 在自己的应用程序当中,也可以使用进程的环境变量。

3 参考文献

  1. 《现代操作系统》

  2. 《linux/unix系统编程手册》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu22.04平台编译完美解决问题“error: GLSL 4.5 is not supported.”【GLSL(OpenGL着色器语言)】

GLSL介绍 GLSL&#xff08;OpenGL着色器语言&#xff09;是用于编写OpenGL着色器程序的语言。GLSL 4.5 是 GLSL 的一个版本&#xff0c;引入了许多新的特性和改进&#xff0c;旨在提高着色器编程的灵活性和性能。GLSL 4.5 工具通常是用于编写、调试和优化 GLSL 4.5 着色器代码…

Java基于微信小程序的校园外卖平台系统,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

怎么将本地VScode与Linux云服务器上的Vscode联动起来

首先我们打开本地刚刚下好的VScode&#xff0c; 下载remote SSH插件 按下F1 找到该选项&#xff0c; 点击 然后输入ssh 用户名公网地址 点击选择第一个 此时你的VScode左侧栏里就会出现这个图标 点进来后就可以看到主机已经加载进来了(如果没有&#xff0c; 关闭VScode重进…

工业4g路由器联网后迅速掉线是什么原因?

工业4G路由器连接上网后迅速掉线可能是由多种因素造成的。以下是一些建议的检查和解决步骤&#xff1a; 1、信号问题&#xff1a; 信号强度&#xff1a;检查工业路由器信号强度指示灯&#xff0c;如果信号弱&#xff0c;尝试移动路由器位置或添加外部天线来增强信号。 网络拥…

绘画尝试1

提示词&#xff1a;Elegant woman, standing in a picturesque courtyard, slender figure, graceful posture, elegant back, smooth neck line, flashing charming eyes. 绘画成果&#xff1a;

机器学习和深度学习

一、定义 机器学习是一种人工智能领域的分支&#xff0c;旨在使计算机系统能够自动从数据中学习和提高性能&#xff0c;而不需要明确的编程。简而言之&#xff0c;机器学习是利用经验来训练计算机系统&#xff0c;使其能够从输入数据中提取规律&#xff0c;并对新数据进行预测…

百度松果菁英班——机器学习实践四:文本词频分析

飞桨AI Studio星河社区-人工智能学习与实训社区 &#x1f96a;jieba分词词频统计 import jieba # jieba中文分词库 ​ with open(test.txt, r, encodingUTF-8) as novelFile:novel novelFile.read() # print(novel) stopwords [line.strip() for line in open(stop.txt, r,…

mac老版本如何升级到最新版本

mac老版本如何升级到最新版本 老macbook升级新版本&#xff08;Big sur、Monterey&#xff09; 首先介绍我的电脑的机型及情况&#xff1a; 2015年初的MacBook Air 处理器是1.6Hz 双核Interl Core i5 内存4G 老版本只能升到10.13 想要升到最高版本的原因&#xff1a;想要注册…

React18从入门到实战

文章目录 一、React环境的搭建二、项目文件的介绍&#xff08;1&#xff09;package.json&#xff0c;他是项目存放依赖包的地方&#xff0c;里面包括了一些项目核心包及下载的其他插件包&#xff08;2&#xff09;src文件夹是项目源码目录&#xff0c;平时开发页面就在其中&am…

【ArcGIS微课1000例】0108:ArcGIS计算归一化差值植被指数

本文讲解ArcGIS中,基于Landsat8数据的NDVI归一化差值植被指数计算。 文章目录 一、加载数据二、归一化植被指数NDVI1. NDVI介绍2. NDVI计算三、注意事项一、加载数据 加载配套数据0108.rar中的Landsat8的8个单波段数据,如下所示: Landsat8波段信息对照表如下表所示: 接下来…

前端开发语言有那些?

前端开发语言有那些&#xff1f; 1、html 超文本标记语言&#xff1a;构建前端网页的基本结构&#xff0c;就象人的骨架一样。 2、css 层叠样式表&#xff1a;控制网页的样式和布局&#xff0c;就象人需要穿各种服式展现不同风采。 3、javascript 简称 JS 动态脚本语言&#x…

论文笔记:Detecting Pretraining Data from Large Language Models

iclr 2024 reviewer评分 5688 1 intro 论文考虑的问题&#xff1a;给定一段文本和对一个黑盒语言模型的访问权限&#xff0c;在不知道其预训练数据的情况下&#xff0c;能否判断该模型是否在这段文本上进行了预训练 这个问题是成员推断攻击(Membership Inference Attacks&…

SpriingBoot整合MongoDB多数据源

背景&#xff1a; MongoDB多数据源&#xff1a;springboot为3以上版本&#xff0c;spring-boot-starter-data-mongodb低版本MongoDBFactory已过时&#xff0c; 改为MongoDatabaseFactory。 1、pom引入&#xff1a; <dependency><groupId>org.springframework.boo…

axios取消请求,解决接口返回顺序错乱问题

下面的方案适用于系统中的某个请求的取消&#xff0c;项目的请求使用 axios 封装 使用场景&#xff1a;当页面有多个 tab&#xff0c;例如年、月、日的列表数据&#xff0c;当点击切换的时候要获取对应的数据&#xff0c;此时如果快速点击在tab直接反复横跳会出现下面的问题&am…

K8S - Service简介和 1个简单NodePort例子

大纲图 流量方向 如上图&#xff0c; 当用户or 别的service 从k8s 集群外部访问 集群内的services 流量方向有两种 一种是垂直方向&#xff0c; 通过域名 -> Load Balancer -> gateway -> services , 在k8s 一般是通过ingress 来实现&#xff0c; 而ingress 不是本文…

免费https详细教程

简单叙述一下https的定义和实现https的一些基本作用&#xff0c;然后会给到申请SSL证书的方式以及安装部署流程&#xff0c;最终实现网站的https访问。 随着互联网的快速发展&#xff0c;网络安全问题日益凸显。在互联网上传输敏感信息、进行在线交易和共享个人数据时&#xf…

nginx配置实例-负载均衡

目录 一、目的&#xff1a;实现效果 二、准备工作 三、实验部署 3.1修改第二台Tomcat服务器的监听端口为8081 3.2修改完成后&#xff0c;重新启动tomcat8081这台服务器。 3.3在浏览器测试 3.4在两台tomcat里面webapps目录中&#xff0c;创建名称是edu的文件夹&#xff0c…

Vue的学习之旅-part3

Vue的学习之旅-part1 vue的自带指令v-model的修饰符 一般用于input输入框中v-model.numberv-model.trimv-slot 作用域插槽具名插槽插槽-组件数据传递注意点1&#xff1a;注意点2&#xff1a; v-on: 绑定触发事件v-on监听事件的修饰符冒泡&#xff1a; 通过.stop阻止阻止默认行为…

软考118-上午题-【软件工程】-能力成熟度模型

一、考试题型 选择题&#xff08;13题&#xff09; 二、能力成熟度模型CMM 能力成熟度模型CMM的研究目的是&#xff1a;提供一种评价软件承接方能力的方法&#xff0c;同时它可帮助软件组织改进其软件过程。 CMM 将软件过程改进分为以下5个成熟度级别&#xff1a; 1、初始级…

探索实践昏暗光线低光照场景下目标检测,基于YOLOv7【tiny/l/x】模型开发构建昏暗光线低光照场景下的目标检测识别系统

昏暗光线低光照条件下的目标检测问题&#xff0c;是机器视觉领域一个长期存在且持续受到关注的挑战。这个问题的背景主要源自现代社会对机器视觉技术的广泛需求&#xff0c;特别是在光线条件不佳的环境下&#xff0c;如夜间监控、自动驾驶、安防系统等场景。在昏暗光线或低光照…