linux终端输入ls会计算机会经过哪些步骤?


在 Linux 终端输入一个命令(例如 ls)后,操作系统会经历一系列的步骤来处理这个命令。这个过程涉及多个系统调用,以下是详细的处理过程:

输入命令

用户在终端中输入一个命令,比如ls,并按下回车键。

Shell 解析

终端运行一个 shell(如 bash),shell 读取用户输入并解析命令行。这一步通常通过读取标准输入(stdin)来实现。

查找可执行文件

Shell 解析命令后,会查找对应的可执行文件。这涉及以下几个步骤和系统调用:

  1. 读取环境变量 PATH

    • 系统调用:getenv("PATH")
    • Shell 通过获取环境变量 PATH 来查找命令所在的目录。
  2. 查找可执行文件

    • 系统调用:access(path, X_OK)
    • Shell 会遍历 PATH 中的每个目录,使用 access 系统调用检查是否存在具有执行权限的命令文件。

创建子进程

找到可执行文件后,shell 会创建一个子进程来执行命令。涉及的系统调用如下:

  1. 创建子进程
    • 系统调用:fork()
    • fork 创建一个子进程,子进程是父进程的副本。

执行命令

在子进程中,shell 使用 exec 系列系统调用之一来替换当前进程的内存空间,使其运行新程序。

  1. 执行命令
    • 系统调用:execve(path, argv, envp)
    • execve 系统调用用找到的可执行文件替换当前进程的镜像。参数 argv 是传递给程序的参数列表,envp 是环境变量列表。

等待子进程完成

父进程(shell)等待子进程完成执行。这涉及到以下系统调用:

  1. 等待子进程
    • 系统调用:waitpid(pid, &status, 0)
    • waitpid 系统调用使父进程等待子进程完成,并获取其退出状态。

子进程执行命令

子进程执行命令,如 ls,会经历以下步骤:

  1. 打开目录

    • 系统调用:opendir()
    • 打开当前目录以读取文件和目录列表。
  2. 读取目录内容

    • 系统调用:readdir()
    • 逐个读取目录中的条目。
  3. 获取文件信息

    • 系统调用:stat()
    • 获取每个文件或目录的状态信息(如权限、大小等)。
  4. 输出结果

    • 系统调用:write()
    • 将结果写入标准输出(stdout),通常是终端。

退出子进程

命令执行完毕后,子进程会退出并返回状态码。

  1. 退出进程
    • 系统调用:exit(status)
    • 子进程调用 exit 系统调用退出,并返回状态码给父进程。

Shell 获取子进程状态

父进程(shell)通过 waitpid 获取子进程的状态,并在需要时处理返回结果或错误。

总结

在终端输入命令并执行的整个过程中,操作系统涉及到多个系统调用,包括但不限于 getenvaccessforkexecvewaitpidopendirreaddirstatwrite。这些系统调用共同完成了从命令解析、进程创建、命令执行到进程退出的全过程。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值