当前位置:  技术问答>linux和unix

新进程是怎样被加载运行的

    来源: 互联网  发布时间:2017-02-14

    本文导语:  对于"可执行映像文件的内容替换它正执行的 s h e l l二进制映像"这种说法,我不太理解,为什么要这样做啊,shell直接把可执行文件加载到进程中运行不就可以了,干嘛还要先克隆个自身,再替换自身。 ...

对于"可执行映像文件的内容替换它正执行的 s h e l l二进制映像"这种说法,我不太理解,为什么要这样做啊,shell直接把可执行文件加载到进程中运行不就可以了,干嘛还要先克隆个自身,再替换自身。

|
假设你shell下执行 cat /proc/cpuinfo | grep xxx
shell检测到第一个命令cat后,不用fork,即不拷贝shell自己的代码,直接用cat的代码替换掉shell进程,那么这个进程就只有cat的功能。管道| 和 后面的grep就无法执行了,因为cat并没有这些功能。处理管道定向以及再启动多个命令都是shell的功能。
所以shell要一直存在并控制全局,所以要fork备份自己,创建子进程去执行具体的命令,父进程还是shell

|
没有理解linux里程序运行的原理才有这样的疑惑

首先,linux内核在启动完成后,就不再主动运行了。就相当于驻留在内存里的一段代码,只有各个进程需要调用内核的服务时候才会运行(就是系统调用),以及发生中断的时候才会运行。
所以创建子进程的动作是应用程序主动发起的,内核只是提供创建子进程的服务,内核不会主动创建子进程的。

然后就是为什么要先克隆,再创建。这是linux内核提供的创建进程的步骤。一般我们的理解,创建子进程,内核就完全从头开始构建子进程:分配对应的数据结构,把程序从磁盘装入相应的内存... ,这样的做法也是最合理的。
但是从头创建一个进程内核需要为这个进程产生很多数据结构的分配和初始化,这个过程很消耗cpu资源。如果从一个已经存在的进程结构入手,先创建一个进程的拷贝,再修改这个拷贝,装入新的程序,就能大大提高效率。所以先拷贝再装入程序的方法创建子进程,是为了提高效率。

你说的“管道| 和 后面的grep就无法执行了”,shell常驻内存的,它会根据管道后面的命令来处理grep的
------------------------------
一个进程同时只能装入一个程序的代码(不同的时间可以是不同的程序的代码,例如clone),所以你既然说shell要常驻内存,那么就一定会占据一个进程的代码段内存。所以需要创建子进程执行具体的命令。

    
 
 

您可能感兴趣的文章:

  • linux 下如何查看某个进程加载了那些库?
  • 用户进程加载后在哪加入的调度队列的?
  • 请问:我想让配置文件变更后,发一个信号,从而让守护进程重新加载配置,程序思路大约是怎样的啊?
  • 为什么链接器本身是个ld.so文件? 那又由谁去把这个ld.so加载到进程空间呢?
  • 显示任何进程加载的DLL文件的代码
  • 如何通过进程号获得进程的一些信息,例如:进程运行的目录
  • 在suse上运行某个进程,运行一段时间后进程自动消失了,是什么原因呢?
  • 已知进程名,检测进程是否在运行并调用
  • 已知一个进程的PID,但不知道这个进程是否停止,如何能知道系统中是否有相应的进程在运行。
  • 在程序中启动一个进程(不是线程),如何知道该进程已运行结束
  • shell如何判断当前进程是否是当天运行的进程?
  • 急!子进程在运行,结束父进程会出错,怎么解决?
  • “模块”在内核中运行与作为单独进程运行在机制上有什么区别与联系?
  • 请问:进程创建的线程是怎样运行的啊,线程的处理函数运行完了,线程就退出了吗?
  • 中断恢复现场时怎样判断进程运行到那一步,如何无缝连续运行的呢?
  • linux进程(线程)运行过程中如何获取本进程当前的内存使用状况,统计信息?
  • 急急 solaris 系统被自己的进程调用太多堵死了,其它系统进程也运行不了,有没有什么好的办法啊?在线等!!!!
  • 怎么查看Linux中所运行的进程,并且知道哪些是停止响应的,用什么命令可以杀掉停止响应的进程?
  • 某daemon进程运行一段时间后接受到不知何地的终止信号导致进程退出,何解?
  • linux shell关掉后java程序(进程名abc)仍能运行,用ps -ef|grep abc能查到进程名
  • 如何使一个前台运行中得进程变成后台运行的? nohup
  • 如何用函数判断某个守护进程处入运行中
  • 请教:在进程运行中将其转换成守护进程会怎么样?
  • 守护进程里如何运行另一程序?
  • 关于进程不能正常后台运行的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux僵尸(zombie)进程介绍及清除
  • 进程Afork进程B,进程Bfor进程C,如果进程C退出发出SIGCHLD,A进程是否可以收到
  • Ubuntu查看内存,进程相关命令介绍
  • 如果一个server进程要fork许多子进程,但不等待子进程终止,也不希望子进程结束后处于僵进程状态直到父进程终止。请问可采用什么方法实现
  • linux下进程占用内存空间详解
  • 在多进程中父进程frok子进程,怎样让子进程自举,脱离父进程,而且父进程不退出
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • fock()开出的子进程的进程ID是否进程ID都大于父进程的?
  • android 4.0 托管进程介绍及优先级和回收机制
  • 父进程等待子进程n秒,如果子进程正常退出,父进程立即继续向下执行,如果子出现进程故障一直不退出,父进程等待n秒后继续向下执行,请问
  • linux下进程间通信:共享内存原理及具体用法举例(基于c/c++语言)
  • 多进程问题 子进程读取内容 读完挂起,父进程写 写入后唤醒子进程
  • 一个进程首先监听一个端口,等到有连接了就新开一个进程,让新进程来处理后面的通讯。请问母进程中已经打开了端口,子进程怎么来使用同一
  • 我在一个父进程中,生成了4个子进程,子进程的优先级是一样的。我现在想结束子进程。该如何做?
  • 子进程wait/waitpid//子进程不结束,父进程会等待子进程吗?
  • 在一个进程中我定义了几个全局变量,然后我又fork了几个子进程,子进程中是否可以各自对全局变量进行修改,如果各子进程都对其进行修改,
  • 怎样一次杀掉父进程创建的所有子进程?我在父进程中用kill(0,SIGKILL),结果父进程也给干掉了,参数0难道不是表示除自己外的所有同uid的进
  • 进程创建进程组后,然后创建该组中的进程,然后终止。这里的终止....?
  • 如何实现子进程根据父进程的信号来确定是否终止子进程???
  • 高手请教!linux怎样通过pid获取进程信息,如:进程名、进程状态等?
  • 【如何彻底杀死子进程】Kill -9子进程后进程呈僵死状态


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,