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

本文深入解析shell内建命令与外部命令的区别,阐述了Linux系统中如何通过fork和execve调用创建并执行子进程,以及子进程如何继承父进程的资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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函数得到的子进程从父进程的继承了整个进程的地址空间,包括:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值