首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux:进程控制(二.详细讲解进程程序替换)

后面在引入多进程的情况 1.1概念 进程程序替换是指在运行过程中将一个进程的地址空间中的代码、数据和堆栈等内容完全替换为另一个程序的代码、数据和堆栈的过程。...,因为在执行 exec 函数时,操作系统会加载新程序的可执行文件,并将其代码、数据和堆栈等部分加载到进程的地址空间中。...这个过程涉及将新程序的内容从磁盘加载到内存中,为进程提供执行所需的资源。...因此,虽然我们常说是“程序替换”,但实际上更准确地说是将新程序加载到内存中,替换掉原有的程序,以实现进程的功能切换和更新。 程序运行要加载到内存;为什么?冯诺依曼体系规定;如何加载的呢?...这个函数用于将字符串添加到环境变量中,或者修改已经存在的环境变量的值。

22210

Docker的前世今生

在 Linux使用过程中,大家很少会接触到LXC,因为 LXC对于大多数人来说仍然是一个比较陌生的词汇。那为什么我们要在开篇之时,先聊这个陌生的概念呢?...CGroups可以限制、记录、调整进程组所使用的物理资源。比如说:使用 CGroups可以给某项进程组多分配一些CPU使用周期。...同时 CGroups也具有记录物理资源使用情况的功能,比如CGroups调用 cpuacct子系统就可以记录每个进程所使用的内存数量、 CPU时间等数据。...虽然名称发生了变更,但 AUFS本质上仍是堆栈式的联合文件系统。 AUFS的功能简单说就是,可以将分布在不同地方的目录挂载到同一个虚拟文件系统当中。 这句话不长,但理解起来颇需一些脑力。...而对于容器而言,其所看到的所有文件都是可读写的,只不过所有的写操作都被保存在昀上层的文件层当中。

80121
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Linux系统编程】四、Linux环境变量与命令行参数详解

    至于这里为什么要加 呢,因为 PATH 相当于 bash 是一个全局变量,所以用 echo 查看的时候要加上 ​ 下面我们就来介绍一下环境变量! Ⅰ....变量名=变量的值(其中变量的值都被认为是字符串):定义一个本地变量,如 myval=1234567 ,可以用 echo $myval 查看 注意:环境变量是具有全局属性的,而本地变量只有局部属性...说明 myval 不被当前的子进程 myproc 所认识,也就是说 myval 这个本地变量只能被父进程也就是 bash 所认识而已,而不会被子进程继承下来。 ​...,但是为什么它就可以接收到本地变量 myval,我们上面不是说子进程不会继承到本地变量的吗❓❓❓ ​ 这里 echo 当然是命令,echo 在执行的时候肯定是 bash 的子进程里,那么感觉它作为子进程却能继承本地变量的原因是...,当前程序加载到内存后变成进程,也就意味着进程拿到了环境变量。

    11610

    【Linux】Linux环境变量的理解 --- 命令行参数、shell子进程、环境变量、本地变量…

    export可以用来将shell变量导入到环境变量PATH里面,导入的时候需要先将老的环境变量导入进去然后在加上新的路径,否则会出现你的路径直接覆盖掉之前环境变量PATH里面的所有路径的情况,PATH里面的路径下的所有程序都被默认为是系统指令...在我们登录shell的时候,会默认让你当前的shell进程,把对应的bash_profile里面的内容执行一次,就是将环境变量导入到你当前的shell进程当中,环境变量的配置就是通过它在启动的时候加载到...在main函数中实际上有隐藏的参数,只不过我们平常不使用这些参数,因为我们平常用不着,在系统编程中,使用这些参数是比较常见的,并且main会被一个叫START_UP的函数调用,START_UP函数在你的程序加载到内存的时候...可以看到,通过main函数的第三个参数,子进程也可以获得所有的环境变量。这也是子进程继承shell环境变量的一种方式。 2....每个进程都会被shell传一个环境表,环境表是一个字符指针数组,每个指针指向一个以斜杠0结尾的环境变量字符串 2.3 第三方指针变量environ(获取所有的环境变量名和内容) 1.

    2.1K31

    【Linux】OS、进程PCB、状态、进程的切换和调度,深入理解虚拟地址空间

    ,当active队列中的进程都被调度一遍后,只需要交换active和expired两个指针,然后重复这个操作进程调度。...所有的进程都要用链表连接,进程既可以在调度队列中,也可以在阻塞队列中…这是怎么实现的呢? 意义是什么?...一个进程,既可以在全局链表中,又可以在不脱离全局链表的情况下在任何一个数据结构中(形成了一张网),只要加节点字段即可。 原理是什么? 如果节点结构体中只有前后指针,那如何访问数据呢?...如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。...但是这种修改只是临时的,因为这些环境变量只是加载到bash进程中,它是内存级的。

    7600

    计算机的运行原理

    要想让程序处理数据,完成计算任务,必须把程序从外部设备加载到内存中,并且在操作系统的管理调度下交给CPU去执行,去运行起来,才能真正发挥软件的作用,程序运行起来之后,被称为进程。...操作系统把执行代码加载到内存中,生成相应的数据结构和内存空间后,就可以从可以执行的代码的起始位置读取指令交给CPU顺序执行,指令执行的过程中,可能会遇到一条跳转指令,即CPU要执行的下一条指令不是内存中可以执行的代码顺序的下一条指令...正在执行的函数参数,局部变量、申请的内存地址等都在当前栈帧中,也就是堆栈的顶部栈帧中。...不同进程轮流在CPU上执行,每次都要进行进程间的CPU的切换,代价是非常大的,实际上,每个用户请求对应的不是一个进程,而是一个线程,线程可以理解为轻量级的进程,在进程中创建,拥有的自己的线程栈,在CPU...系统为什么会变慢,为什么会崩溃 现在的服务器软件系统主要使用多线程技术实现多任务的处理,完成对很多用户的并发请求处理。

    71441

    Docker Compose 配置文件 docker-compose.yml 详解

    未声明版本的Compose配置文件都被视为V1版,所有的服务都作为根选项在Compose配置文件中声明。...target:指定要挂载到服务的任务容器的文件的路径加名称。如果未指定,默认为/。 uid和gid:指定服务的任务容器所拥有的该文件的UID或GID。如果在LInux中未指定,两者都默认为0。...例如以下示例,指定config名称为my_config,授予redis服务对my_config的访问权限,指定要挂载到redis服务的任务容器的路径加文件名称为/redis_config,指定UID和GID...如果指定了多个环境文件且有至少两个文件声明了相同名称但不同值的环境变量,那么指定列表中顺序靠下的文件将覆盖顺序靠上的文件中的相同名称的环境变量的值。...变量替换 配置项中的值可以包含环境变量,Compose会使用运行docker-compose时所在的shell中的环境变量值来替换Compose配置文件中的环境变量,\({VARIABLE}和\)VARIABLE

    18.3K21

    Linux下exec函数族详解

    对于exec函数族来说,它的作用通俗来说就是使另一个可执行程序替换当前的进程,当我们在执行一个进程的过程中,通过exec函数使得另一个可执行程序A的数据段、代码段和堆栈段取代当前进程B的数据段...、代码段和堆栈段,那么当前的进程就开始执行A中的内容,这一过程中不会创建新的进程,而且PID也没有改变。...一般exec函数族的用途有以下两种:        1. 当进程不需要再往下继续运行时,调用exec函数族中的函数让自己得以延续下去。        2....其中execvpe和execle一般不常用,下面就以例子来看看具体的用法以及所展示出来的效果是怎么样的,便于更好的理解exec函数的作用,先来看一下下面的这个代码: #include ...由于execl成功调用后这个进程的代码段都被替换了,自然下面的代码就不会再执行了,所以也就没有返回值了,但是当调用失败后就会返回-1并设置errno值。

    8.6K30

    【Linux修炼】9.环境变量

    事实上,这并不是将myval添加到了环境变量中,而是因为如下原因: 我们知道,bash是一个系统进程,并且bash进程是所有创建进程的父进程,即我们....而环境变量具有全局属性,也就是说环境变量本来就是定义给bash的,但是bash的环境变量会被子进程继承下去(为什么要继承,为了不同的应用场景 ——让bash帮我找指令路径,身份认证),也就是说子进程能够使用...在开始之前,大家回想一下,有的编译器中的main函数中存在着这样的参数: 比如上面的DevC++中,main()中有着整形的argc参数和指针数组的argv参数,事实上,这两个参数这就是我们这一节中的主角...执行: 我们可以发现,所打印的结果,就是对应的命令行中的命令以及选项,因此我们也知道了为什么叫做命令行参数: 但main函数是程序的入口,那么是谁调用了main函数呢?...其中推荐的是getenv获取,因为可以指定获取。 5. 总结环境变量 通过上面的描述,我们知道,环境变量就是操作系统启动之后将内部内容加载到内存中的变量,也就是全局变量。

    1.3K00

    磁盘:最容易被忽略的性能洼地

    (2) 将libfork.so添加到环境变量LD_PRELOAD中 在UNIX中,LD_PRELOAD是一个可以影响程序的运行时链接的环境变量,让你可以定义在程序运行前优先加载的动态链接库。...而这个功能就可以用来有选择性地载入不同动态链接库中的相同函数。而在zygote进程启动前设置LD_PRELOAD环境变量,这样zygote的所有子进程都会继承这个环境变量。...这样我们就实现了区分进程和场景的I/O 信息收集。 在介绍了我们的工具原理之后,来看一下采集的I/O 日志信息,包括文件路径、进程、线程、读/ 写文件的次数、大小和耗时以及调用的堆栈。 ?...)就加1。...但是这种Hook针对整个系统生效,即系统所有I/O操作都被Hook,造成Hook的数据量巨大,系统动不动就卡死。

    1.2K20

    环境变量与命令行参数详解

    至于这里为什么要加 呢,因为 PATH 相当于 bash 是一个全局变量,所以用 echo 查看的时候要加上 下面我们就来介绍一下环境变量! Ⅰ....环境变量(environment variables) 1、基本概念 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数 我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里...变量名=变量的值(其中变量的值都被认为是字符串):定义一个本地变量,如 myval=1234567 ,可以用 echo $myval 查看 注意:环境变量是具有全局属性的,而本地变量只有局部属性(...myval 不被当前的子进程 myproc 所认识,也就是说 myval 这个本地变量只能被父进程也就是 bash 所认识而已,不会被子进程继承下来。 ​...后知后觉,是不是有点奇怪,明明 echo 也是一个指令呀,使用它的时候也是会创建子进程的,但是为什么它就可以接收到本地变量 myval,我们上面不是说子进程不会继承到本地变量的吗 ? ​

    1.4K20

    镜像的原理

    镜像是一种轻量级, 可执行的独立软件包, 用来打包软件运行环境和基于运行环境开发的软件, 它包含运行某个软件所需的所有内容, 包括代码, 运行时, 库, 环境变量和配置文件. 1....最大的好处就是---共享资源 比如: 有多个镜像都从base镜像构建二来, 那么宿主机只需要在磁盘上保存一份base镜像, 同时内存中也只需要加载这一份base镜像, 就可以为所有的容器服务了, 而且镜像的每一层都可以被共享...Docker镜像的特点 docker镜像都是只读的, 一个新的可写层被加载到镜像的顶部, 这一层通常被称为"容器层", "容器层"之下的都被称为"镜像层". 三....之前就不知道为什么启动不起来. 原因就是, 这里没有前台运行的守护进程. 所以, 一启动, 就退出了 让docker 容器在前台启动守护进程的方法有很多....比如 -it /bin/bash, 比如在dockerfile中添加前台运行守护进程等 docker run -it --name test docker.io/centos 比如: 加一个-it进入到客户端

    1.4K30

    Linux进程概念(三)

    为什么存在进程地址空间 环境变量 什么是环境变量 我们所有写的程序都需要指定路径才能运行,就像这样:(程序里面是打印DLC循环) 生成的etv是一个可执行程序,但是我们平时使用的指令比如...那么系统是如何找到的,是因为有一个环境变量——PATH,他在全局都是有效的,是系统默认的指令搜索路径(想查看前面加$): 这是查看PATH环境变量中的内容,用 : 隔开的是不同路径。...,history) 环境变量相关命令 echo: 显示某个环境变量值(记得加$) export: 设置一个新的环境变量 env: 显示所有环境变量 unset: 清除环境变量 set...这里将本地变量变成环境变量。 环境变量是具有全局属性的,会被子进程继承下去。 PWD 执行可执行程序在当前路径是需要带路径的,但是ls并不需要,这是为什么呢?...虚拟空间是操作系统防止用户把物理内存给玩坏所弄出来的空间,是通过页表来进行映射和管理的: 在32位的机器中,操作系统会给每个进程“画个大饼”,说你们每个进程都可以分配到2^32字节(约等于4GB)的空间大小

    56500

    【Linux】进程概念(下)

    中的指令也是可执行程序,那么为什么它们的指令不用加 ./ 就能正常运行呢?...这就和我们的环境变量 PATH 有关了,PATH 是系统默认的搜索路径,只要将我们程序的路径添加到 PATH 中,我们的程序也不需要加 ./ 就能跑啦!...(4)env 查看所有的环境变量 我们可以使用 env 指令查看所有的环境变量,Linux 中的环境变量非常多,大家可以自行查看。而每一个环境变量都有它自己的特殊用途,用来完成特定的系统功能。 3....环境变量:环境变量通过让所有的子进程继承的方式,实现自身的全局性!环境变量是天然让所有子进程继承下去的! 5....其实,我们上面所学的空间分布的那张图,就是进程地址空间,里面的地址全都是虚拟地址!如下图: 但是我们的进程需要被cpu调度,进程中的数据要被cpu读取识别,就必须加载到内存中,即物理内存中。

    17210

    内核态与用户态_linux内核态和用户态通信

    (alloc_task_struct()+8192),这也是为什么系统空间通常用宏定义current(参看其实现)获取当前进程的 task_struct地址的原因。...除了处于不同CPU特权级中,这两个堆栈之间的主要区别在于任务的内核态堆栈很小,所保存的数据量最多不能超过4096 – 任务数据结构块个字节,大约为3KB。...当一个任务(进程)刚被创建时,它的用户态堆栈指针被设置在其地址空间的靠近末端(64MB顶端)部分。实际上末端部分还要包括执行程序的参数和环境变量,然后才是用户堆栈空间,如图5-24所示。...图5-25 进程的内核态堆栈示意图 为什么从主内存区申请得来的用于保存任务数据结构的一页内存也能被设置成内核数据段中的数据呢,即tss.ss0为什么能被设置成0x10呢?...我们可以从内核代码段的长度范围来说明。在head.s程序的末端,分别设置了内核代码段和数据段的描述符,段长度都被设置成了16MB。

    1.8K20

    Linux系统-进程概念

    (CPU):含有运算器和控制器等 输出单元:显示器,打印机等 存储器:物理内存 注:输入单元和输出单元统称外设 工作原理: 执行程序时,输入设备的数据先预加载到存储器中,通过存储器将数据交给...CPU,CPU得到结果再将数据写入内存,最后内存将数据刷新到网卡 朋友的电脑:输入设备网卡将数据写到内存,内存再将数据给CPU,CPU得到结果再将数据写入内存,最后内存将数据刷新到显示器上 为什么运行程序必须先加载到内存...上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器 //当多个程序需要同时被执行,而一个程序有执行的时间片,达到时间需要切换程序,切换到恢复的过程就需要上下文数据发挥作用,...)状态:表示进程追踪状态,即进程在调试中停下来的一个状态(有些内核版本没有该状态) 示图: 查看状态指令基本格式及选项: ps aux / ps axj :查看系统中所有的进程 ps -la :查看基础进程...环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性(可以被子进程继承) 示例: 我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功

    1.1K20

    【Linux】进程切换&&环境变量

    日常使用的电脑大部分都是单核的,即同一时间仅执行一个进程。那为什么在电脑上可以同时打开多个软件呢?这就跟进程切换有关了。...(2) 计算机调度某个进程时,CPU 会把这个进程的 PCB 地址加载到某个寄存器,也就是说,CPU内有寄存器可以只找到进程的PCB地址。...1.显示所有的环境变量:env 2.环境变量具有全局性,被所有进程所共享,如果不想让其他进程看到,可以设置本地环境变量: 3.如果设置的本地环境变量不想使用了,可以用unset清理掉。...环境变量通常具有全局属性,可以被子进程所继承。...ls作为系统命令,是有默认搜索路径的,存放在PATH变量中。但是,系统为什么知道在那个路径下找my.out这个文件呢?

    20210

    Linux进程控制

    替换原理 一个可执行程序被首先被加载到内存中,然后执行代码,然后代码中有操作让本程序执行一个新程序,这个时候就会将指定执行的程序的代码和数据覆盖掉原本的代码和数据,在整个过程中并没有产生新的进程,...替换函数 执行系统命令 这些函数的作用是将指定的程序加载到内存当中,让指定的进程执行。...现在的自定义环境变量还没定义,所以为空。 我们发现,如果没有自定义环境变量,系统自带的环境变量就会被打印,但是如果自定义环境变量系统自带的环境变量就不会被打印。...是先调用exec函数,因为它的作用上面说了,是将程序加载到内存中,Linux中,它就是加载器。...第三步是打印,创建一个子进程帮我们工作,这是因为exec函数会替换掉原来程序中所有的代码和数据: 然后我们还可以设置一个条件编译来看看字符指针数组中的字符切割是否正确: 先来测试一下上面的程序是否正确

    2.9K00

    docker基础知识整理

    删除容器 docker pause 暂停容器中所有的进程; docker unpause 恢复容器中所有的进程; docker exec : 在运行的容器中执行命令 docker exec -it mynginx...包括Exited等状态的容器; docker top 查看容器中运行的进程信息,支持 ps 命令参数; ? docker inspect 获取容器/镜像的元数据; ?...在主机上使用 ifconfig命令,可以看到此网桥是主机的网络堆栈的一部分。 none 网络在一个特定于容器的网络堆栈上添加了一个容器。该容器缺少网络接口。...host 网络在主机网络堆栈上添加一个容器。容器中的网络配置与主机相同。可以通过主机IP访问,端口也会使用主机端口。所以主机端口不能被占用,否则容器启动会有问题。...,之后都是value,包括后面的空格),第二种用于同时设置多个变量(空格为分隔符,value中包含空格时可以用双引号把value括起来,或者在空格前加\反斜线),当需要同时设置多个环境变量时推荐使用第二种格式

    78740

    LinuxThreads和NPTL

    这些相对于基于进程的方法所具有的优点推动了 LinuxThreads 的实现。    ...主线程要进入睡眠状态,而管理线程的工作就是在所有线程都被杀死之后来唤醒这个主线程。 为了维护线程本地数据和内存,LinuxThreads 使用了进程地址空间的高位内存(就在堆栈地址之下)。...下面让我们来看一下 LinuxThreads 设计的一些局限性: 它使用管理线程来创建线程,并对每个进程所拥有的所有线程进行协调。这增加了创建和销毁线程所需要的开销。...例如,一个多线程的 setuid()/setgid() 进程对于不同的线程来说可能都是不同的。 有一些情况下,所创建的多线程核心转储中并没有包含所有的线程信息。...同样,这种行为也是每个线程都是一个进程这个事实所导致的结果。如果任何线程发生了问题,我们在系统的核心文件中只能看到这个线程的信息。

    75130
    领券