网站友情链接很重要吗,怎样只做自己的网站,网站建设 h5,墨刀网站开发原型图教程进程替换
上一篇草率的讲完了进程地址空间的组成结构和之间的关系#xff0c;那么我们接下来了解一下程序的替换。
首先#xff0c;在进程部分我们提过了#xff0c;其实文件可以在运行时变成进程#xff0c;而我们使用的Linux软件其实也是一个进程#xff0c;所以进一步…进程替换
上一篇草率的讲完了进程地址空间的组成结构和之间的关系那么我们接下来了解一下程序的替换。
首先在进程部分我们提过了其实文件可以在运行时变成进程而我们使用的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并不只是这样还能往除了上述三个以外的地方读写这个就在下一篇进行详解了。