后台面试经典问题-shell命令的执行

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hahachenchen789/article/details/83275809

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

 

内建命令,由shell解释程序内建,由shell直接执行,不需要派生新的进程

常见的内建命令:

bg、cd、continue、echo、exec、exit、export、fg、jobs、pwd、read、return、set、shift、test、times

 

外部命令分两种:二进制代码和shell脚本

shell执行外部程序时,会创建一个新的进程来执行命令,默认shell将等待直到该进程结束

常见的外部命令:

grep more cat mkdir rmdir ls  sort  ftp  telnet  ssh   ps  等

 

Linux通过fork调用,来创建一个新的进程,fork会创建原有进程的存储的精确拷贝。

调用fork的进程的父进程,由fork创建的是子进程。

 

对于外部二进制命令(/bin下的都是),shell需要一种机制,将子进程转换成将要执行的命名,Linux调用execve可以实现将子shell变身为外部命令,这样外部命令就取代了先前fork出的子shell。

 

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

 

 

使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:

进程上下文,进程堆栈,内存信息,打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。

但要注意的是,子进程获得了父进程数据空间,堆和栈的副本。但子进程与父进程并不共享存储空间。

猜你喜欢

转载自blog.csdn.net/hahachenchen789/article/details/83275809
今日推荐