怎么做图片展示网站,境外电商有哪些平台,网站设计用什么字体好,asp做企业网站很好啊一、进程与可执行程序之间关系的理解 系统会将此时在系统运行的进程的各种属性都以文件的形式给你保存在系统的proc目录下。运行一个程序的时候#xff0c;本质就是把磁盘中的程序拷贝到内存中#xff0c;当一个进程运行起来的时候#xff0c;它本质已经和磁盘中的可执行程序…一、进程与可执行程序之间关系的理解 系统会将此时在系统运行的进程的各种属性都以文件的形式给你保存在系统的proc目录下。运行一个程序的时候本质就是把磁盘中的程序拷贝到内存中当一个进程运行起来的时候它本质已经和磁盘中的可执行程序没有直接关系了。 当前我的myprocess程序正在运行 而此时我将其对应的可执行程序删掉 这个进程所对应的可执行程序已经被语法高亮了证明已经被删掉了 而此时我的可执行程序仍在运行这也从侧面证明了当一个进程运行起来的时候它本质已经和磁盘中的可执行程序没有直接关系了。从上面的截图中我们也可以看到/proc目录下的虚拟文件系统是会记录下进程的工作目录和对应可执行程序的路径/proc目录下记录的进程信息与PCB中的某些信息有重叠比如说PCB中同样也会记录下进程的工作目录和对应可执行程序的路径。
二、通过系统调用创建进程
fork:创建子进程 fork之后有两个执行分支fork之后代码共享也就是说fork之后的代码父进程和子进程都会执行。下面的5986进程就是bash进程。 #include stdio.h2 #include unistd.h3 int main()4 {5 printf(before fork : pid:%d ppid:%d\n, getpid(), getppid());6 7 pid_t id fork();8 9 printf(after fork : pid:%d ppid:%d returnid: %d\n, getpid(), getppid(), id);10 11 return 0;} 第二条printf语句在fork之后为父子进程共享所以第二条printf语句会打印两次。我们也可以看到其中父子进程fork的返回值是不一样的父进程fork返回的是子进程的pid子进程返回的是0。 那这里就会有疑问了为什么fork给父进程返回子进程的pid给子进程返回0原因是在进程中一个父进程可能会有多个子进程父进程想要管理子进程必须通过子进程的标识符所以父进程必须知道子进程的标识符而子进程只需要关心自己是否成功创建了所以返回0。 那fork函数为什么会返回两次呢原因是fork本身是一个系统调用函数fork内部本身也会有很多代码的当fork函数执行到最后return pid的时候它的核心工作已经做完了子进程其实已经被创建出来了return pid也是一条语句既然父子进程已经都被创建出来了那么父子进程当然都可以执行return pid语句咯所以return pid被执行了两次所以fork就会返回两次。 那上面的id可是同一个变量啊怎么会即大于零又等于零呢这和linux中的虚拟地址有关也就是说一个变量可以指向不同的地址空间。
写实拷贝 任意进程之间是具有独立性的不会互相影响。创建一个进程的时候系统中就会多一个进程当子进程创建时系统就必须为子进程创建出一个全新的PCBtask_struct父进程会把自己PCB中很多内容拷贝给子进程的PCB也就是说子进程被创建是以父进程为模版的。进程都有自己的代码和数据系统创建出来的子进程的PCB默认就会指向父进程的代码和数据想让父子进程分别执行不同的程序那就可以在代码中根据父子进程fork返回值的不同设置ifelse语句让父子进程分别执行不同的代码。上面说到父子进程共享代码和数据当父子进程任意一方要对数据进行修改时都可能会对另一方造成影响上面又说到任意进程之间是具有独立性的不会互相影响那么这时操作系统就会介入将要修改的数据给子进程以子进程修改数据为例拷贝一份让子进程修改拷贝的这一份数据子进程也不再指向原来的那一份数据而是指向修改拷贝的这一份数据。这就叫做写实拷贝。