shell 命令的执行—fork & exec

shell命令分为 内建命令 & 外部命令

内建命令(builtin command) 是shell解释程序内建的, 由shell直接执行,不需要派生新的进程。
   常见的内建命令:
 
   
  1. .(点命令)、bgcdcontinueechoexecexitexportfgjobspwdreadreturnsetshifttesttimestrapumaskunsetwait.

  外部命令分为两种: 二进制代码 或 shell脚本。
  shell执行外部命令时,会创建一个新的进程来执行命令。默认shell将等待直到该进程结束。      
  常见的外部命令:
  
 
   
  1. grep more cat mkdir rmdir ls  sort  ftp  telnet  ssh   ps  等

   Linux能通过fork()调用,创建一个新的进程,fork会创建原有进程的贮存的精确拷贝。
   调用fork的进程是父进程,而由fork创建的进程是子进程。shell 外部命令时,父进程通过fork创建了一个和它一模一样的子进程。
   对于 外部二进制命令(/bin 下的都是二进制可执行文件),shell 需要一种机制,把 子进程 转换为 将要执行的命令。Linux调用execve可以实现将子shell "变身为" 外部命令,execve允许一个进程用其他外部命令的可执行代码覆盖自己。总的来说就是: shell 解释器会调用fork 自身的一个拷贝,然后调用 exec 系列函数来执行外部命令, 这样外部命令就取代了先前的子shell. 

   对于脚本,shell解释器会fork一个子进程,子进程会检查脚本的第一行(#!/bin/sh ),找到用来执行脚本的解释程序,然后装入这个解释程序,由它解释执行脚本。解释程序可能有很多种,各种shell(Bash、Korn shell、cshell)等等。  在此解释程序是当前shell的子进程。 如果 这个解释器与当前shell使用的是同一种shell,比如都是bash,他就是当前shell的子shell。 脚本中的命令都是在子shell中运行的,不会影响当前shell的环境。


使用fork函数得到的 子进程从父进程的继承了整个进程的地址空间,包括:
进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。


你可能感兴趣的:(Shell-编程)