进程替换
上一篇草率的讲完了进程地址空间的组成结构和之间的关系,那么我们接下来了解一下程序的替换。
首先,在进程部分我们提过了,其实文件可以在运行时变成进程,而我们使用的Linux软件其实也是一个进程,所以进一步来说,我们在Linux里写的一切文件都是子进程,而进程的替换一般就发生在父子进程之间,我们先了解一下它的特性,首先如果使用了进程替换,那么它会在替换处直接取代原有代码,覆盖式的运行,所以并不会产生新的子进程,也不会减少进程。所以一旦替换成功,之后的代码都会被覆盖不会执行。
那么我们接下来认识一下替换的方法:
exec系列
可以根据情况来使用这个系列进行替换。
execl
这里的 L 其实就代表 List 所以我们需要在参数结束时额外提供一个NULL给它辨认。
首先我们提供了一个路径给它,因为它需要我们给路径,然后它去找到路径然后执行。
之后我们紧跟着提供我们要执行的命令,当然你闲麻烦可以直接 " -al " ,最后最重要的是给一个NULL。
可以看到正如我们所料,在替换之前的内容被打印了,然后程序被替换成了 ls -al
而我们的 替换结束 这句话并没有被打印,因为是覆盖式替换。
上面是替换成功的情况,那么替换如果失败,则有一个值为-1的返回值,这个系列的接口只有失败才会有返回值,毕竟成功就运行了。
可以看到确实如此。
execlp
先上图
它们俩之间,其实并没有区别,只不过一个给了具体路径,一个没给,没给的那个是因为人家有path环境变量给系统带路呢。所以我们的execlp里的P就是Path,在这个接口,我们可以不用提供具体的路径给它,就像我们平时使用一般给个 ls 就好了(当然你想给全路径也行),系统会自己去path里找的,所以相对的,这个接口比较适合那些系统自带的命令使用,或者你不嫌麻烦把自己的路径添加进去也行。
它的用法也确实很简单,毕竟有了execl的前车之鉴,结果也不出所料。
execv
这里的V代表的就是Vector,当然了,它没带p所以第一个参数得给具体路径。
实际上它就是支持你把参数先放进数组里,然后一次性传进来,当然它为了防止类型的问题,所以可能会需要你进行强转保险。
所以衍生一下 execvp 想必我不说大伙也该知道咋用了。
execvpe
新BOSS来了,v和p我们都知道了,e是什么呢,e是环境变量,不过它用起来有点麻烦,大伙要先知道每个进程都有属于自己的环境变量,即使是子进程,也是使用父进程的环境变量,但是使用execvpe如果你传入了环境变量,那么它就会使用你传入的而不去使用旧的,但是如果你既想用旧的又想有新的,那可以直接追加。
这个追加的内容最好放在全局,然后就产生两条路了,如果你就想给个一两个,那么直接
这样你要追加的环境变量就会追加到原有的后面,然后你不要用 e 系列接口了,直接继续用execvp就好了。 这个putenv只会从你这里开始生效,也就是说如果你还有子进程,那它也可以看见这个新追加的,但是你的父进程就看不到了,因为这里发生了写实拷贝。
而如果你想追加很多新环境变量,还就想用 e 系列,那你就得
这样还是得先利用全局的数组去遍历的追加,然后putenv追加进去,最后
声明出来以后再把这个 environ 当环境变量传进去,这个environ就是原有的环境变量和追加的环境变量结合后的结果。
进程替换的实际使用
这就需要结合我们之前的父子进程了,我们在子进程使用替换的话并不会影响父进程,因为父子之间有写实拷贝,所以,我们可以利用子进程去跑我们想跑的进程,就像父进程就像函数调用一样。
我们甚至可以在自己的进程里替换成别的进程执行。
这是一个简单的c++程序。
随后我们就在之前的.c文件里创建一个子进程,然后用子进程替换我们的.cc文件。
然后我们就可以看见,它并不受到语言间的差异替换成功了。衍生一下就可以变成,根据上层传过来的数据形式,利用exec系列的接口来接收再使用。
基础IO
概念
首先在Linux环境下,对于文件,广义上的理解就是一切皆文件,而狭义的理解就是文件存放在磁盘里,磁盘是外设,它既是输入也是输出设备,所以对文件的操作就是对磁盘进行输入输出。而文件 = 内容 + 属性 ,所以对文件进行操作无非就是对文件的内容和属性做操作。
那么,谁来进行操作呢,操作系统。 但是操作系统不可能只管理一个文件,而我们也不可能只有一个文件,所以操作系统会为每一个文件创建一个包含该文件信息的结构体,然后利用一个链表来进行统一管理。
读写
在Linux里执行读写的操作其实和C语言一样,都是fopen打开,然后fread读或者fwrite写,最后记得fclose关闭即可。
这样就模拟出了一个cat的效果,可以只要有我们提供的文件名,它自己自动打印文件内容出来。
而根据我们的读写概念来理解,其实打印就是往指定位置输入内容,而这些位置一般又分为三个
:stdin标准输入 键盘文件、stdout标准输出 显示器文件 stderr 标准错误,显示器文件。
在程序启动时会自动打开这三个,所以我们能看到运行的结果或者过程。
以上就是基础IO的概念和以往的用法回顾,但是IO并不只是这样,还能往除了上述三个以外的地方读写,这个就在下一篇进行详解了。