【Linux C | 进程】进程环境 | 什么是进程?进程的开始、终止、存储空间布局、命令行参数、环境变量

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍 🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、进程的开始、终止
    • ✨2.1 main 函数
    • ✨2.2 进程终止
  • 🎄三、程序的存储空间布局
  • 🎄四、命令行参数
  • 🎄五、环境表、环境变量
    • ✨5.1 环境表
    • ✨5.2 环境变量
  • 🎄六、总结


在这里插入图片描述

🎄一、概述

首先,我们了解什么是进程?
当代码编写后编译得到的可执行文件,就是程序,当程序运行起来后就是进程。也就是说,进程就是运行后的程序。

每个进程都有-一-个非负整型表示的唯一进程ID。因为进程D标识符总是唯一的,常将其用作其他标识符的一部分以保证其唯一性。
ID为0的进程通常是调度进程,常被成为交换进程(swapper);
ID为1的进程通常是init进程,在自举过程结束后,由内核调用。

查看进程

  • 1、简单方式
    ps :以简略方式显示当前控制终端的进程信息。
  • 2、复杂方式
    • ps -aux (linux中可用, unix中不支持)
      a: 显示所有用户控制终端的进程信息
      u: 以详尽方式显示
      x: 也显示那些无控制终端的进程信息
    • ps -elf (推荐使用, 具有通用性)
      e: 所有用户的进程
      l: 以长格式显示信息
      f: 按完整格式显示
  • 3、进程信息列表
    • UID : 进程属主
    • PID : 进程ID
    • PPID: 父进程ID
    • TTY: 该进程属于哪个终端
      tty1~tty6: 本机登录者
      pts/?? : 远程登录者
    • PRI, NI: 该进程的优先级 nice
    • S: 进程状态
      O—就绪
      R— 运行状态
      S— sleep
      Z— 僵尸

本文介绍进程的开始(main函数)、终止、存储空间布局、命令行参数、环境变量等。

在这里插入图片描述

🎄二、进程的开始、终止

✨2.1 main 函数

C程序总是从main函数开始执行。

当内核执行C程序时,在调用main前先调用一个特殊的启动例程。可执行程序文件将此启动例程指定为程序的起始地址——这是由连接编辑器设置的,而连接编辑器则由C编译器调用。启动例程从内核取得命令行参数和环境变量值,然后为按上述方式调用main函数做好安排。

✨2.2 进程终止

有8种方式使进程终止(termination),其中5种为正常终止,它们是
(1)从main返回。
(2)调用exit。
(3)调用_exit或_Exit。
(4)最后一个线程从其启动例程返回。
(5)最后一个线程调用pthread_exit

异常终止有3种方式,它们是
(6)调用abort。
(7)接到一个信号并终止。
(8)最后一个线程对取消请求做出响应。

在这里插入图片描述

🎄三、程序的存储空间布局

一般,C程序一直由下面几个部分组成:

  • 正文段(text),也称代码段。这是由CPU执行的机器指令部分。通常,正文段是可共享的,所以即使是频繁执行的程序(如文本编辑器、C编译器和shell等)在存储器中也只需有一个副本,另外,正文段常常是只读的,以防止程序由于意外而修改其自身的指令。
  • 初始化数据段。通常将此段称为数据段,它包含了程序中需明确地赋初值的变量。例如,C程序中出现在任何函数之外的声明:
    int maxcount = 99 ;
    使此变量带有其初值存放在初始化数据段中。
  • 非初始化数据段。通常将此段称为bss段,这一名称来源于一个早期的汇编运算符,意思是“block started by symbol”(由符号开始的块),在程序开始执行之前,内核将此段中的数据初始化为0或空指针。出现在任何函数外的C声明
    longsum [1000] ;
    使此变量存放在非初始化数据段中。
  • 。自动变量以及每次函数调用时所需保存的信息都存放在此段中。每次调用函数时,其返回地址以及调用者的环境信息(例如某些机器寄存器的值)都存放在栈中。然后,最近被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈,可以递归调用C函数。递归函数每次调用自身时,就使用一个新的栈帧,因此一个函数调用实例中的变量集不会影响另一个函数调用实例中的变量。
  • 。通常在堆中进行动态存储分配。由于历史上形成的惯例,堆位于非初始化数据段和栈之间。

在这里插入图片描述

在这里插入图片描述

🎄四、命令行参数

当指向一个C程序时,在命令行给该程序传递参数。传递的参数可以在main函数的两个参数进行读取;

  • argc表示参数个数,程序名也算在参数里。
    ./a.out  # argc为 1,argv[0]就是a.out
    ./a.out command1 test line yes five #argc为 6
    
  • argv是一个char*数组,保存参数的字符串。argv[0]是程序名本身。
#include <stdio.h>
int main (int argc, char *argv [])
{int i;for (i = 0; i < argc; i++){/* echo all command-line args */printf ( "argv [%d] : %s \n", i, argv[i] );}return (0) ;
}

在这里插入图片描述

在这里插入图片描述

🎄五、环境表、环境变量

✨5.1 环境表

每个程序都会接收到一张环境表。与参数表一样,环境表也是一个字符指针数组,其中每个指针包含一个以null结束的C字符串的地址。全局变量environ则包含了该指针数组的地址:

extern char **environ;

通常用getenvputenv函数来访问特定的环境变量,而不是用environ变量。但是,如果要查看整个环境,则必须使用environ指针。

在这里插入图片描述
看例子:

#include <stdio.h>
extern char **environ;
int main (int argc, char *argv [])
{int i;for (i = 0; *(environ+i)!=NULL; i++){/* echo all command-line args */printf ( "environ[%02d]: %s \n", i, *(environ+i) );}return (0) ;
}

在这里插入图片描述

✨5.2 环境变量

ISO C定义了一个函数getenv,可以用其取环境变量值,但是该标准又称环境的内容是由实现定义的。

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

getenv函数搜索环境列表以查找环境变量名,并返回一个指向相应值字符串的指针。

看例子:

#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv [])
{printf ( "HOME=[%s]\n", getenv("HOME"));printf ( "SHELL=[%s]\n", getenv("SHELL"));return (0) ;
}

在这里插入图片描述

🎄六、总结

本文介绍了什么是进程,进程的开始、结束,还有程序的存储空间布局,以及在main函数来获取命令行参数;最后结束环境表、环境变量。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

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

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

相关文章

Web开发:新建一个WebAPI的demo

一、新建一个api项目&#xff0c;并设置为启动项目 二、控制器目录新建一个控制器&#xff0c;命名为TestController&#xff0c;并且添加如下代码 添加后 代码&#xff1a; using Microsoft.AspNetCore.Mvc;namespace WebApplication1.Controllers {public class TestControl…

机器学习实验报告——EM算法

目录 一、算法介绍 1.1算法背景 1.2算法引入 1.3算法假设 1.4算法原理 1.5算法步骤 二、算法公式推导 2.1数学基础 2.2EM算法推导 三、算法实现 3.1关于EM聚类 3.2EM工具包的使用 3.3 实例测试 四、算法讨论 4.1EM算法的优缺点 4.2EM算法的应用 4.3对于EM算法…

【Flink-1.17-教程】-【四】Flink DataStream API(1)源算子(Source)

【Flink-1.17-教程】-【四】Flink DataStream API&#xff08;1&#xff09;源算子&#xff08;Source&#xff09; 1&#xff09;执行环境&#xff08;Execution Environment&#xff09;1.1.创建执行环境1.2.执行模式&#xff08;Execution Mode&#xff09;1.3.触发程序执行…

Oracle 高级网络压缩 白皮书

英文版白皮书在这里 或 这里。 本文包括了对英文白皮书的翻译&#xff0c;和我觉得较重要的要点总结。 执行概述 Oracle Database 12 引入了一项新功能&#xff1a;高级网络压缩&#xff0c;作为高级压缩选项的一部分。 本文概述了高级网络压缩、其优点、配置细节和性能分析…

城市道路智慧养护顶层设计建议书

项目通过对国家在推动智慧交通领域的健康发展上发布的如&#xff1a;《交通强国建设纲要》、《推进综合交通运输大数据发展行动纲要(2020-2025年)》、《数字交通发展规划纲要》等相关政策的深入理解与研究&#xff0c;结合“互联网”、“智能化”、“智慧化”等理念,对国家提出…

STM32CubeMX配置定时器输入捕获功能

STM32CubeMX配置定时器输入捕获功能 0.前言一、方法简介二、STM32CubeMX配置1.生成PWM信号2.配置TIM3_CH1进行采样3.占空比计算 三、总结 参考文章&#xff1a;CubeMX系列教程——11 定时器输入捕获 0.前言 最近在学习江科大STM32教程的原理部分时&#xff0c;发现该教程中使用…

【Unity学习笔记】New Input System 部分源码和测试用例补充

转载请注明出处&#xff1a;&#x1f517;https://blog.csdn.net/weixin_44013533/article/details/135630016 作者&#xff1a;CSDN|Ringleader| 主要参考&#xff1a; Unity官方Input System手册与API【Unity学习笔记】Unity TestRunner使用【Unity学习笔记】第十二 New Inp…

学习笔记-李沐动手学深度学习(二)(08-09、线性回归、优化算法、Softmax回归、损失函数、图片分类)

总结 以_结尾的方法&#xff0c;好像是原位替换&#xff08;即 原地修改&#xff0c;就地修改变量&#xff09;如 fill_() 感恩的心&#xff1a;&#xff08;沐神的直播环境&#xff09; 08-线性回归基础优化算法 引言&#xff08;如何在美国买房&#xff09; 根据现在行…

vue+elementui实现12个日历平铺,初始化工作日,并且可点击

<template><div class"app-container"><el-form :model"queryParams" ref"queryForm" size"small" :inline"true"><el-form-item label"年份" prop"holidayYear"><el-date-…

commit 历史版本记录修正

commit 历史版本记录修正 当 Bug 发生的时候&#xff0c;我们会需要去追踪特定 bug 的历史记录&#xff0c;以查出该 bug 真正发生的原因&#xff0c;这个时候就是版本控制带来最大价值的时候。 因此&#xff0c;要怎样维持一个好的版本记录是非常重要的&#xff0c;下面是一…

为什么说CRM行业化是大势所趋?有哪些判断因素

很多企业、很多销售对CRM的负面评价集中在不够贴合行业、不人性化&#xff0c;也就是功能不够细分和实用。因为CRM几乎是所有企业管理系统中最贴近业务实际的&#xff0c;但各行各业的业务千差万别&#xff0c;所以功能完备、使用满意度高的CRM一定是深度行业化、与不同行业业务…

iPhone解锁工具---AnyMP4 iPhone Unlocker 中文

AnyMP4 iPhone Unlocker是一款功能强大的iPhone解锁软件&#xff0c;旨在帮助用户轻松解锁iPhone&#xff0c;从而在电脑上进行数据备份、传输和编辑。该软件支持多种iPhone型号&#xff0c;包括最新的iPhone 14系列&#xff0c;并支持多种解锁模式&#xff0c;如屏幕密码解锁、…