当前位置: 首页 > wzjs >正文

西安企业建站排名哪个网站建设商招代理

西安企业建站排名,哪个网站建设商招代理,wordpress制作小说站教程,wordpress的多说美化Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将和大家一起学习 linux 的环境变量和程序地址空间~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页&#xff1a;椎名澄嵐-CSDN博客 Linux专栏&#xff1a;https://blog.csdn.net/2302_80328146…

Ciallo~(∠・ω< )⌒☆ ~ 今天,我将和大家一起学习 linux 的环境变量和程序地址空间~

❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️

澄岚主页:椎名澄嵐-CSDN博客

Linux专栏:https://blog.csdn.net/2302_80328146/category_12815302.html?spm=1001.2014.3001.5482
❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️


目录

壹  环境变量

1.1 基本概念

1.2 常见环境变量

1.3 查看环境变量方法

1.3 环境变量相关的命令

1.4 查看环境变量方法

1.4.1 通过env数组获取或设置环境变量

1.4.2 通过系统调用获取或设置环境变量

1.4.3 通过第三方变量environ获取环境变量

贰  程序地址空间

2.1 进程系统空间

2.2 虚拟地址

2.3 进程地址空间

2.4 为什么要有虚拟地址空间

2.5 一些小问题

~ 完 ~


壹  环境变量

1.1 基本概念

  • 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数
  • 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性(父进程bash的环境变量可以被子进程继承)

命令行参数

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

 main的命令行参数是实现出现不同子功能的方法~ 各种指令的选项的实现原理也是这样的~如下程序所示:

int main(int argc, char *argv[])
{if(argc != 2){printf("Usage: %s [-a|-b|-c]\n", argv[0]);return 1;}const char *arg = argv[1];if(strcmp(arg, "-a") == 0)printf("这是功能一~\n");else if(strcmp(arg, "-b") == 0)printf("这是功能二~\n");else if(strcmp(arg, "-c") == 0)printf("这是功能三~\n");elseprintf("Usage: %s [-a|-b|-c]\n", argv[0]);return 0;
}

要执行一个程序,首先要找到他,上图就用了./code,但为什么用ls等命令时不用 ./ 呢~

因为系统中存在环境变量,来帮助我们找到二进制文件~

如上程序code如果拷贝到 /user/bin 目录下,就能不带 ./ 执行~(不推荐)

环境变量在存储的角度就是:登录时bash会读取系统相关的配置文件,形成的一张char*[]链表(环境变量表,把系统相关的配置文件中把一个个配置文件填写的链表中,bash还会接收一张命令行参数表,所以bash中会有两张表。

所以要执行一个程序,bash会通过PATH找到可执行文件

1.2 常见环境变量

  • PATH : 指定命令的搜索路径
  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录) 如:cd ~时bash会把~替换成HOME路径
  • SHELL : 当前Shell,它的值通常是/bin/bash
  • USER :当前用户
  • HISTSIZE : 1000(1000条历史命令)
  • HOSTNAME:当前主机名
  • SSH_TTY :当前登录的终端设备
  • TERM : 终端类型
  • SSH_CLIENT : 当前从哪个客户端登陆的
  • LANG:编码格式
  • PWD : 当前路径
  • OLDPWD :上个操作所在目录

1.3 环境变量相关的命令

  • export: 设置一个新的环境变量

  • unset: 清除环境变量

1.4 查看环境变量方法

  •  echo : 查看单个环境变量
echo $NAME //NAME:你的环境变量名称

  • set : 查看全部环境变量和本地变量
  • env : 查看全部环境变量

1.4.1 通过env数组获取或设置环境变量

#include <stdio.h>
#include <string.h>
// main最多有三个参数
int main(int argc, char *argv[], char *env[])
{(void)argc;(void)argv;for(int i = 0; env[i]; i++){printf("env[%d] -> %s\n", i, env[i]);}return 0;
}

1.4.2 通过系统调用获取或设置环境变量

  • getenv

查看PATH环境变量的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[], char *env[])
{(void)argc;(void)argv;(void)env;char *value = getenv("PATH");if (value == NULL)return 1;printf("PATH -> %s\n", value);return 0;
}

只有当前用户能运行的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[], char *env[])
{(void)argc;(void)argv;(void)env;const char *who = getenv("USER");if(who == NULL)return 1;if(strcmp(who, "zmzz") == 0) // 自己用户名printf("程序正常运行~\n");elseprintf("Only zmzz!!!\n");return 0;
}

1.4.3 通过第三方变量environ获取环境变量

头文件:unistd.h

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
extern char** environ;int main(int argc, char *argv[], char *env[])
{(void)argc;(void)argv;(void)env;for(int i = 0; environ[i]; i++){printf("env[%d] -> %s\n", i,  environ[i]);}return 0;
}

贰  程序地址空间

2.1 进程系统空间

也叫虚拟地址空间,是一个系统的概念,而不是一个语言层的概念。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_unval;
int g_val = 100;
int main(int argc, char *argv[], char *env[])
{const char *str = "helloworld";printf("code addr: %p\n", main);printf("init global addr: %p\n", &g_val);printf("uninit global addr: %p\n", &g_unval);static int test = 10;char *heap_mem = (char*)malloc(10);char *heap_mem1 = (char*)malloc(10);char *heap_mem2 = (char*)malloc(10);char *heap_mem3 = (char*)malloc(10);printf("heap addr: %p\n", heap_mem); //heap_mem(0), &heap_mem(1)printf("heap addr: %p\n", heap_mem1); //heap_mem(0), &heap_mem(1)printf("heap addr: %p\n", heap_mem2); //heap_mem(0), &heap_mem(1)printf("heap addr: %p\n", heap_mem3); //heap_mem(0), &heap_mem(1)printf("test static addr: %p\n", &test); //heap_mem(0), &heap_mem(1)printf("stack addr: %p\n", &heap_mem); //heap_mem(0), &heap_mem(1)printf("stack addr: %p\n", &heap_mem1); //heap_mem(0), &heap_mem(1)printf("stack addr: %p\n", &heap_mem2); //heap_mem(0), &heap_mem(1)printf("stack addr: %p\n", &heap_mem3); //heap_mem(0), &heap_mem(1)printf("read only string addr: %p\n", str);for(int i = 0 ;i < argc; i++){printf("argv[%d]: %p\n", i, argv[i]);}for(int i = 0; env[i]; i++){printf("env[%d]: %p\n", i, env[i]);}return 0;
}
code addr: 0x558ea0e90189
init global addr: 0x558ea0e93010
uninit global addr: 0x558ea0e9301c
heap addr: 0x558ea179d6b0
heap addr: 0x558ea179d6d0
heap addr: 0x558ea179d6f0
heap addr: 0x558ea179d710
test static addr: 0x558ea0e93014
stack addr: 0x7ffcec4cf850
stack addr: 0x7ffcec4cf858
stack addr: 0x7ffcec4cf860
stack addr: 0x7ffcec4cf868
read only string addr: 0x558ea0e91004
argv[0]: 0x7ffcec4d0748
env[0]: 0x7ffcec4d074f
env[1]: 0x7ffcec4d075f
env[2]: 0x7ffcec4d078a
env[3]: 0x7ffcec4d0797
env[4]: 0x7ffcec4d07ac
env[5]: 0x7ffcec4d07bb
env[6]: 0x7ffcec4d07cb
env[7]: 0x7ffcec4d07dc
env[8]: 0x7ffcec4d0dcb
env[9]: 0x7ffcec4d0e00
env[10]: 0x7ffcec4d0e22
env[11]: 0x7ffcec4d0e39
env[12]: 0x7ffcec4d0e44
env[13]: 0x7ffcec4d0e64
env[14]: 0x7ffcec4d0e6e
env[15]: 0x7ffcec4d0e85
env[16]: 0x7ffcec4d0e8d
env[17]: 0x7ffcec4d0ea2
env[18]: 0x7ffcec4d0ec1
env[19]: 0x7ffcec4d0ee4
env[20]: 0x7ffcec4d0f25
env[21]: 0x7ffcec4d0f8d
env[22]: 0x7ffcec4d0fc3
env[23]: 0x7ffcec4d0fd6
env[24]: 0x7ffcec4d0fe8

2.2 虚拟地址

 以下是一个有父子进程的程序, 有一个全局变量gval, 子进程每隔一秒使gval+1,并显示父子进程信息:

#include <stdio.h>
#include <unistd.h>int gval = 100;int main()
{pid_t id = fork();if(id == 0){while(1){printf("子:gval: %d, &gval: %p, pid: %d, ppid: %d\n", gval, &gval, getpid(), getppid());sleep(1);gval++;}}else{while(1){printf("父:gval: %d, &gval: %p, pid: %d, ppid: %d\n", gval, &gval, getpid(), getppid());sleep(1);}}
}

运行后发现父子进程信息中的gval的地址一样,但gval值不一样,所以这个取地址获得的不是内存地址,是虚拟地址。

原理如下图:父进程的pcb和页表给子进程时是浅拷贝,子进程++时为了确保进程独立性,做了写时拷贝,使得一个虚拟地址对应了不同的物理地址~ 

2.3 进程地址空间

 进程地址空间就是在内核中的一个数据结构(mm_struct),对各进程的内存进行管理。

2.4 为什么要有虚拟地址空间

  1. 可以将“无序”的物理地址转化为“有序”的虚拟地址,供上层用户使用~
  2. 地址转换过程中对地址和操作进行合法性判定,保护物理内存~
  3. 缺页中断:如果代码太大,可以先不在内存中加载,用到时再暂停进程,动态加载,(页表中还有是否在物理内存中的一列)~
  4. 让进程管理和内存管理进行一定程度的解耦合~

2.5 一些小问题

1.  堆不止一个起始地址,mm_struct 怎么管理:

会有一个链表,多段维护, 一个堆区对应一个vm_area_struct

2. 创建进程,先有task_struct,mm_struct等,还是先加载代码和数据?

先有pcb,可以不加载代码和数据,只有task_struct,mm_struct和页表

3. 如何理解进程挂起?

发现内存空间不足时,会清空页表,把物理内存中的数据换出到磁盘的一个特定空间里,内存就空出来了,这就体现了解耦合


~ 完 ~


文章转载自:

http://GXj4J4pg.hxhrg.cn
http://JPnHAOb5.hxhrg.cn
http://0Vj4MPrk.hxhrg.cn
http://qTZxxEm2.hxhrg.cn
http://H0uSNHE3.hxhrg.cn
http://uhGfl0tw.hxhrg.cn
http://XCKaXsni.hxhrg.cn
http://96o9wKNQ.hxhrg.cn
http://9oiT9OgB.hxhrg.cn
http://KKibpDfN.hxhrg.cn
http://99vdGMxu.hxhrg.cn
http://TgW97Ej6.hxhrg.cn
http://KhHmML68.hxhrg.cn
http://PKFmuYv5.hxhrg.cn
http://tREW9C5I.hxhrg.cn
http://Bv0uBQDv.hxhrg.cn
http://8sTpL6tN.hxhrg.cn
http://1bt60FRc.hxhrg.cn
http://G4LVNSrE.hxhrg.cn
http://TUgZbU03.hxhrg.cn
http://qoQ2agoi.hxhrg.cn
http://VbdfC27w.hxhrg.cn
http://QzWiaFsx.hxhrg.cn
http://k4g3c2ny.hxhrg.cn
http://6y6u1rGP.hxhrg.cn
http://8tw7SynX.hxhrg.cn
http://QszlrjT3.hxhrg.cn
http://HYK2eunH.hxhrg.cn
http://fbyfVvsY.hxhrg.cn
http://8Uy3YS3g.hxhrg.cn
http://www.dtcms.com/wzjs/717736.html

相关文章:

  • 专业做化妆品的网站网站建设实训主要收获及体会
  • 个人免费网站建站排名建一个多用户团购网站需要多少钱
  • 果洛电子商务网站建设多少钱现今网站开发的主流框架
  • 南阳教育网站平台网页版梦幻西游宠物
  • 网站产品内容在数据库如何做正规电影网站
  • 瑞安哪里有做百度的网站利用论坛推广网站
  • 济宁网站一个网站怎么留住用户
  • 营销型网站 易网拓深圳网站建设设计制作
  • 建网站需要什么手需wordpress被墙变慢
  • 北京专业响应式网站建设运城 网站 建设 招聘
  • 阿里云服务器如何实现一个空间绑定两个不同主体的网站上海专业的网站建
  • 网站开发实习生衡水龙腾网站建设
  • 广州服务好的网站推广工具wordpress 自定义评论样式
  • 门户网站建设总结河南省建设厅网站公示公告
  • 内网网站如何建设嘉定注册公司
  • 中山市建设局网站窗口电话永康关键词优化
  • 郑州网站制作的公司哪家好怎么生成网页
  • 边境网站建设方案网站开发设计比赛
  • 一个网站的建设流程山东省建设执业资格注册中心网站
  • 响应式网站和自适应网站网站的功能定位
  • 济南外贸网站无锡网站建设原则
  • 图片网站 代码第一赢销网
  • 广州网站建设定制科技网站建设公司
  • 网站建设定位分析论文开发工程师是程序员吗
  • 加强公司门户网站建设方案做购物网站之前做些什么
  • 网站建设与管理感想产品推广活动方案
  • 唐山制作手机网站米拓建站怎么样
  • 网站关键词先后影视app制作
  • 溧阳做网站哪家好无锡做智能网站
  • 天津市建设工程网站安徽省建设工程信息网官方网站