Open wsxk opened 3 months ago
https://wsxk.github.io/linux_basic2/
前言
program加载与执行过程
11.1 进程创建 11.2 进程加载
前言 想要了解linux的基础概念,可以先看看https://wsxk.github.io/linux_basic/
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
十分神奇!
https://wsxk.github.io/linux_basic2/
前言
program加载与执行过程
11.1 进程创建 11.2 进程加载
前言 想要了解linux的基础概念,可以先看看https://wsxk.github.io/linux_basic/
11.1 进程创建 在linux系统中,进程都是通过分裂来进行传播的,具体而言,当我们在terminal(bash)中执行cat xxx时,父进程(bash)会通过系统调用fork()或者clone()创建跟父进程近乎一样的子进程,随后,子进程会通过系统调用execve()来把自身替换成其他进程,在这个例子中就是cat
11.2 进程加载 在执行execve()这个动作时,kernel会检测文件是否可执行,即executable权限,如果不可执行,那么execve()系统调用会失败 在确定文件是可执行的后,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
十分神奇!