news 2026/5/14 7:41:13

硬核手搓解析!进程-内核分析:命令行参数及环境变量,重构main()

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
硬核手搓解析!进程-内核分析:命令行参数及环境变量,重构main()

目录

命令行参数与环境变量

命令行参数

vim下的main()

环境变量

环境变量的应用举例

查询环境变量

全部查询

针对名称查询(常用的方式)

环境变量的更改

配置环境变量

进程:命令行参数及环境变量的关系

结论

获取环境变量

①getenv();

②environ();

本地变量

特性:

本地变量的删除:

本地变量->环境变量:

问题探讨(内建命令)

库函数与系统调用


重构了main()函数-参数、运行环境,基于Linux进程深度下的吐血整理~~

命令行参数与环境变量

命令行参数

一个命令可以通过 [选项] 来实现特定的功能。

像:ls -a 及ls -a -l

类似于以前使用的main()函数中你可能见过的l两种形态:

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

main()作为程序的入口,实际上我们也可以通过外部指定[选项]来传入并调用特定功能:

vim下的main()

vim内:

int main(int argc, char *argv[]) { //…… return 0; }

在bash:

# 执行命令 ./a.out -l -a hello world 123

本质就是将"-l -a hello world 123"分别分割并传入argv[]

argc5
argv[0]"./myprogram"(程序名)
argv[1]"-l"
argv[2]"-a"
argv[3]"hello"
argv[4]"world"
argv[5]"123"
argv[6]NULL(结束标志)

运行代码:

#include <stdio.h> int main(int argc, char *argv[]) { printf("参数个数: %d\n", argc); for (int i = 0; i < argc; i++) { printf("argv[%d] = %s\n", i, argv[i]); } return 0; }

makefile内:

1 SRC=$(wildcard *.c) 2 OBJ=$(SRC:.c=.o) 3 CC=gcc -std=c99 4 LFLAGS=-o 5 FLAGS=-c 6 RM=rm -f 7 all:$(OBJ) 8 $(CC) $^ $(LFLAGS) pc 9 %.o:%.c 10 $(CC) $(FLAGS) $< $(LFLAGS) $@ 11 .PHONY: clean 12 clean: 13 $(RM) pc $(OBJ)

运行:

环境变量

功能:环境变量是进程级[背景]配置。

特性说明
本质键值对(HOME=/home/wzb)
作用配置环境运行环境,无需修改代码
继承性子进程自动继承父进程的环境变量
作用范围当前进程及其子进程

因此:环境变量具有全局特性,可被所有进程继承

“进程级”配置又是一位程序新引入的执行逻辑,大大增加代码的复杂度。就像C中引入条件语句一般,是跨越性进步。

环境变量的应用举例

查询环境变量

全部查询

env

会打印显示全部已配置环境变量:
格式为[环境变量名称]=[环境变量内容]

针对名称查询(常用的方式)

echo $[名称] #例如:echo $PATH

环境变量的更改

①[原名称]=[新的绝对路径] #覆盖原路径
②[原名称]=$[原名称]:[拼接路径] #简便地路径拼接

配置环境变量

增加环境变量:

export [名称]=[内容]

删除环境变量:

unset [名称]

进程:命令行参数及环境变量的关系

无需多言:
我们在VS2022下运行

#include<stdio.h> int main(int argc, char* argv[], char* envp[]) { // envp是环境变量数组,格式为"KEY=val" for (char** env = envp; *env != NULL; env++) { printf("%s\n", *env); } return 0; }

运行结果:

结果显而易见:环境变量全部显现。

结论

因此:自入进程开始我们就处于“命令行参数”+“环境变量”的配置环境。图示如下:

获取环境变量

①getenv();

头文件<stdlib.h>
函数原型:

char* getenv(const char* name);

使用:

输入环境变量的名称来获取指向环境变量值的指针/NULL。 // "指向目录路径"

#include <stdio.h> #include <stdlib.h> int main() { char *path = getenv("PATH"); char *home = getenv("HOME"); printf("PATH: %s\n", path); printf("HOME: %s\n", home); return 0; }

运行结果:

PATH: /usr/local/bin:/usr/bin:/bin HOME: /home/wzb
②environ();

头文件:<stdlib.h>
函数原型:

extern char** environ;

二级指针型访问数据可使用下标直接访问

代码实现:

输出同样的结果:


本地变量

本地变量是定义于vim外bash内的变量。

特性:

不会被子进程继承。
定义时"="两侧不能加空格#否则会被当做命令进行查询 像:i=10正确而i = 10就是错误的!!

本地变量的删除:

像环境变量一样:

unset [本地变量名]

本地变量->环境变量:

export[本地变量名称]

问题探讨(内建命令)

众所周知:Linux指令是bash进程下执行文件的子进程。

假如export指令是一般性指令,怎么做到的子进程指令处理内容到父进程呢?

实际上:export别于一般性指令,其本质是“内建命令”(build-in command)。
其不需要创建子进程,而是让bash自己操作

库函数与系统调用

指令"man"的指定页查询:

1用户命令(可执行程序)ls,cd,grep,find
2系统调用(内核提供的接口)read,write,open,fork
3库函数(C 标准库)printf,malloc,strcpy

库函数与系统调用的对比

维度系统调用库函数
运行空间内核态(Kernel Mode)用户态(User Mode)
调用开销大(需上下文切换)小(普通函数调用)
实现者操作系统内核语言库(如 glibc)或应用程序
例子read()write()open()fork()printf()scanf()fread()strcpy()
是否缓冲无缓冲(直接操作内核)通常有缓冲(如 stdio 缓冲)
执行速度

博主吐血回顾重构整理 求关注
o(╥﹏╥)o

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/14 7:35:33

开源API逆向工程:豆包大模型免费接口实现与部署指南

1. 项目概述&#xff1a;一个开源API的诞生与价值最近在开源社区里&#xff0c;一个名为LLM-Red-Team/doubao-free-api的项目引起了我的注意。乍一看这个标题&#xff0c;可能很多朋友会有点懵&#xff0c;这到底是个啥&#xff1f;简单来说&#xff0c;这是一个为“豆包”大模…

作者头像 李华
网站建设 2026/5/14 7:33:05

A/B 测试:模型效果验证

A/B 测试&#xff1a;模型效果验证 1. 技术分析 1.1 A/B 测试原理 A/B 测试是对比不同模型版本效果的方法&#xff1a; A/B 测试流程分流 → 实验 → 收集数据 → 统计分析 → 决策1.2 A/B 测试类型 类型对比对象目的适用场景模型对比不同模型选择最优模型模型迭代参数对比不同…

作者头像 李华
网站建设 2026/5/14 7:32:08

微软雷德蒙德总部探秘:从AI云平台到零信任安全的技术创新引擎

1. 探访微软雷德蒙德&#xff1a;一次深度技术之旅的幕后观察作为一名长期关注科技行业动态的从业者&#xff0c;我始终对那些塑造了我们数字世界的巨头公司内部运作抱有浓厚的好奇心。我们每天使用着Windows、Office、Azure&#xff0c;但创造这些产品的环境、文化和人&#x…

作者头像 李华
网站建设 2026/5/14 7:26:06

Web Security Academy 第四关:SQL 注入查询 MySQL / SQL Server 版本

大家好&#xff0c;本篇是 Web Security Academy 第四关 超详细图文教程&#xff0c;每一步操作、页面响应、请求包都和你的截图 1:1 对应&#xff0c;跟着做直接通关。另外&#xff0c;我之前已经发布过 SQL Server数据库基础、注入语法、版本查询 的文章&#xff0c;对 SQL S…

作者头像 李华
网站建设 2026/5/14 7:23:13

智能体开发实战:基于openclaw-skill-session-context的会话上下文管理

1. 项目概述与核心价值最近在折腾智能体&#xff08;Agent&#xff09;和技能编排&#xff0c;发现一个挺有意思的库&#xff1a;thomasmarcel/openclaw-skill-session-context。乍一看这个名字&#xff0c;可能有点摸不着头脑&#xff0c;但如果你也在做类似的事情——比如构建…

作者头像 李华