微信制作宣传网站有哪些内容wordpress使用百度编辑器
微信制作宣传网站有哪些内容,wordpress使用百度编辑器,旅游网站在提高用户体验方面应做哪些工作,做网站需要流程本章目标
1.getpid与getppid
2.重谈查看进程
3.创建进程
1.getpid与getppid
在上一篇文章,我们提到了如何通过系统调用获取当前进程的pid
在linux操作系统当中进程的创建都是通过父进程创建子进程的方式实现的
那么为了区分父子进程,在一个进程中除了标识当前进程的pid还要包含…本章目标1.getpid与getppid2.重谈查看进程3.创建进程1.getpid与getppid在上一篇文章,我们提到了如何通过系统调用获取当前进程的pid在linux操作系统当中进程的创建都是通过父进程创建子进程的方式实现的那么为了区分父子进程,在一个进程中除了标识当前进程的pid还要包含父进程的pidgetppid这个系统调用的工作原理是通过当前进程中指向父进程的task_struct指针间接拿到父进程的pid.我们打开上一次的代码,我们通过打监控的方式看到了当前进程的pid,我们能够看到当前进程的pid和ppid.那么对于test进程,pid我们很明确那么ppid是谁?我们重新启动进程,在这里补充一个问题.我们pid是进程启动的时候系统给分配的.这个pid的个数在操作系统中,我们可以理解为是一个全局变量.一旦超出这个数它就会回绕.因为每次启动都会分配一个pid,它也就是线性递增的回到我们当前的话题.我们重新拿到了这个进程的pid在,我们看到当前test进程的test的ppid,我们通过监控可以看到,这个进程的父进程是bash,也就是我们的命令行解释器.这也就印证了我们前面的说法,我们的进程在linux操作系统当中是通过父进程创建子进程的方式创建出来的.我那现在演示时下ppid的用法.它的使用方法是与getpid的方法类似的2.重谈查看进程在之前的我们讨论过我们可以直接查看根目录的中proc目录下的内容.这里面放着的就是当前操作系统下所以的实时进程一旦进程创建,我们就会在这个目录下创建一个当前进程pid为名字的目录.里面放着的就是我们当前进程的pcb也就是task_struct的内容.我们在这里要重新讨论一个问题.我们之前有关于文件操作的时候我们fopen以写的时候打开然后给一个在当前目录下的没有的文件名.这个函数是如何知道我们我们要在这个工作目录下创建该文件.谁告诉它的它实际上是从当前进程的pcb里面拿的每一个进程在创建的时候,会将它所启动的位置,也就是当前进程的exe文件所在的目录记录在这个pcb中,也就是这个cwd这个链接文件.我们在调用fopen这个函数,如果我们没有指定这个路径的话,会用这个pcb中的cwd给的路径去拼接这个文件名去创建.那么我们该如何去证明这个问题,我们可以通过一个系统调用去修改当前进程的cwdchdir这个系统调用有一个参数,我们可以给它一个相对路径或者说是绝对路径,然后去修改当前进程的cwd.我们现在演示以下这是没使用系统调用前的状态,一切按照我们的想法,这个文件创建在这个和这个二进制可执行文件在一起的地方了.现在我们系统调用去修改工作路径.但要注意权限问题.我们不能直接扔根目录里面,我们只是普通用户.当我们通过系统调用去修改当前进程的工作路径的时候,它创建在我们所指定的目录,也就是我们当前用户的家目录当中.3.创建进程在前面我们聊过在Linux中创建新进程的方式是通过父进程创建子进程的方式去进程创建的.本质上是操作系统当中多了一个进程.而创建进程我们也需要通过系统调用.我们先简单介绍下这个系统调用.先使用以下,然后再介绍下它的原理再Linux中,操作系统给我提供的系统调用是fork,这个函数不需要我们去传参数.但是它的返回值是有很大的说道的.我们下面演示以下我们可以看到我们在最开始执行程序的时候最开始只有一个执行流104370再经过fork之后有了两个执行流,这就是为了一个代码执行了两遍而两边的结果却是不同的.在这里面我们能够得出一个结论.在进程fork之后,父进程与子进程是共享的fork之后代码的.但是我们创建子进程的时候,创建它的目的就是为了完成任务.而父进程去做其他的东西.这个时候我们就需要通过fork之后的返回值进行父子分流.我们可以通过man手册去查看fork的返回值详细说明,有时间的可以看以下,下面我们直接演示,看文字过于晦涩.我先不解释我们直接看结果fork的返回值一共有三种情况当子进程创建成功的时候fork的返回值分为两种它会将子进程的pid返回给父进程把0给子进程当子进程创建失败的情况下它会给父进程返回-1在这里就引出了三个问题1.为什么要给子进程返回0,给父进程返回子进程的pid2.fork,它是一个函数,它是如何做到一次调用,返回两次的.3.一个id 它是如何接受两个不同的返回值,而且不冲突的.1.为什么要给子进程返回0,给父进程返回子进程的pid关于这个问题,我们要先拿现实世界中的例子进行举例在现实世界中我们父亲与孩子的比例是1比多,对于孩子来说,它只需要管父亲叫爹,而父亲为了区分孩子就需要通过他们的名字来进行区分回到我们技术上.子进程只需要知道父亲是谁就行,所以给个0父进程为了将子进程进行区分需要知道每一个子进程是谁,也就是需要将子进程的pid给父进程,pid是一个进程的唯一标识.获得了pid也就能够将子进程进行区分了2.fork,它是一个函数,它是如何做到一次调用,返回两次的.关于这个问题,我们同样先引出一个问题.在一个函数内部,再它的return 之前,它的核心功能一般来说就已经实现完了.同样的回到我们fork函数,它的目的是为了创建子进程,再进行将pid进行返回前,它的父子分流也就做好,在前面我也提到过,对于父子进程来说,它们的代码时共享的,着就是时说明这个return,会被父子执行流执行两次.着也就说说明fork一个函数,通过一次系统调用,返回两次的原因3.一个id 它是如何接受两个不同的返回值,而且不冲突的.这个问题,对于现在我们的知识储备来说,可能不够,我先简单叙述下,有关于这其中的细节会在后面的进程地址空间的章节中详解在我们之前实现stl容器中的string的时候提到了一种技术叫做引用计数的写实拷贝在stirng只是浅拷贝或者时只读的情况,我们让两个不同的容器对象指向同一块空间在一个对象进行修改的时候,我们再对他重新开辟空间,进行深拷贝回到我们现在的流程我在这篇文章中反复提及到在Linux中创造一个进程,是通过父进程创建子进程的方式实现的本质上在操作系统当中多出了一个进程而子进程创建的时候是以父进程为蓝本的.fork会对它重新创建一个pcb或者叫task_struct,大部分属性都继承自父进程,但有些属性仍然需要进行修改pid或者ppid我们今天简单理解将这一块认为只是简单的代码与数据构成的因为是继承下来的子进程应该指向和父进程相同的代码与数据.因为id是一个变量,它会在接受fork返回值的时候进行修改.这个时候操作系统就会子进程重新在内存中开辟一块空间.让它修改的地方指向新开辟的空间.被他修改的id也就保存在这块区域了大白话说就是数据块被分开了,id被分别的保存到两个不同的内存块当中.这样也就说明了一个id,它是如和接受两个不同的返回值,而且不冲突.