shell 命令的执行—fork & exec

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Cooling88/article/details/52302544
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函数得到的 子进程从父进程的继承了整个进程的地址空间,包括:
进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值