wsxk / wsxk.github.io

MIT License
5 stars 0 forks source link

linux: 程序加载与执行 #185

Open wsxk opened 3 months ago

wsxk commented 3 months ago

https://wsxk.github.io/linux_basic2/

前言

  1. program加载与执行过程

    11.1 进程创建 11.2 进程加载

前言 想要了解linux的基础概念,可以先看看https://wsxk.github.io/linux_basic/

  1. program加载与执行过程 当你在一个shell中执行一个程序时,你不会好奇:这个程序是如何被加载然后执行的吗? 以执行/bin/cat为例,程序会执行如下7个步骤
  2. A process is created. 进程创建
  3. Cat is loaded. Cat程序被加载
  4. Cat is initialized. Cat程序被初始化
  5. Cat is launched. Cat程序被运行
  6. Cat reads its arguments and environment. Cat程序读取参数和环境变量
  7. Cat does its thing. Cat程序开始做正式工作
  8. Cat terminates. Cat程序结束运行

11.1 进程创建 在linux系统中,进程都是通过分裂来进行传播的,具体而言,当我们在terminal(bash)中执行cat xxx时,父进程(bash)会通过系统调用fork()或者clone()创建跟父进程近乎一样的子进程,随后,子进程会通过系统调用execve()来把自身替换成其他进程,在这个例子中就是cat

11.2 进程加载 在执行execve()这个动作时,kernel会检测文件是否可执行,即executable权限,如果不可执行,那么execve()系统调用会失败 在确定文件是可执行的后,kernel还会为了确定加载什么内容而做如下图所示的检测

首先判断文件是否以#!开头,如果是,kernel会提取该行接下来的内容,并将其当作解释器用来执行,原始的命令作为解释器的参数(直接跟在解释器后面)

例子:

在这个例子,文件以#!开头,kernel提取/bin/echo作为解释器,即运行这个程序 此时命令相当于:

/bin/echo ./some-script

因此some-script文件中的echo hi就不会打印出来 这个过程也可以是递归的,再看一个例子:

在这个例子中,some-script2中的解释器是some-script,在执行命令./some-script2时,相当于:

./some-script ./some-script2

而在运行./some-script ./some-script2相当于

/bin/echo ./some-script ./some-script2

十分神奇!