news 2026/5/9 0:19:54

【Linux】进程控制(4)自主shell命令行解释器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Linux】进程控制(4)自主shell命令行解释器

【Linux】进程控制(4)自主shell命令行解释器

这一部分的目标是:自己动手写一个极简的 shell,通过这个过程把之前学过的进程控制知识(fork/exec/wait/signal/管道/重定向等)串联起来。

目标 shell 的功能范围(极简版)

  • 显示提示符(如myshell$
  • 读取一行用户输入
  • 支持最基本的命令执行(不带参数也可以先支持)
  • 支持带参数的命令(空格分隔)
  • 支持后台运行(命令末尾有&
  • 支持前台命令的 wait
  • 支持 exit / quit 退出
  • (可选扩展)支持管道|、重定向>>><&&||

实现思路总览

while (true) { 打印提示符 读取整行输入 → line 如果 line 为空 或 是 exit/quit → break 解析 line → 切分出命令 + 参数数组 argv[] → 判断是否有 & (后台) if (是内置命令,如 cd exit) { 直接在当前进程执行 } else { pid = fork() if (pid == 0) { // 子进程 execvp(命令, argv) perror("exec失败"); exit(1); } else { // 父进程(shell) if (不是后台) { waitpid(pid, &status, 0); } else { printf("[后台任务] pid = %d\n", pid); // 可以选择不 wait,等它自己结束或用 waitpid(-1,...) 回收 } } } }

极简版代码(推荐先实现这个)

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/wait.h>#include<errno.h>#defineMAX_LINE1024#defineMAX_ARGS64intmain(void){charline[MAX_LINE];char*argv[MAX_ARGS];charprompt[]="myshell$ ";while(1){printf("%s",prompt);fflush(stdout);// 读取整行if(!fgets(line,MAX_LINE,stdin)){break;// ctrl+D}// 去掉末尾换行line[strcspn(line,"\n")]=0;// 空行直接继续if(strlen(line)==0)continue;// 退出命令if(strcmp(line,"exit")==0||strcmp(line,"quit")==0){break;}// 解析参数intargc=0;char*token=strtok(line," \t");intbackground=0;while(token){if(strcmp(token,"&")==0){background=1;break;// & 后面不再解析}argv[argc++]=token;token=strtok(NULL," \t");}argv[argc]=NULL;if(argc==0)continue;// 内置命令(先简单处理 exit/cd)if(strcmp(argv[0],"cd")==0){if(argc<2){fprintf(stderr,"cd: 缺少参数\n");}elseif(chdir(argv[1])!=0){perror("chdir");}continue;}// fork + execpid_tpid=fork();if(pid<0){perror("fork");continue;}if(pid==0){// 子进程execvp(argv[0],argv);// 走到这里说明 exec 失败fprintf(stderr,"命令 '%s' 执行失败: %s\n",argv[0],strerror(errno));exit(127);}// 父进程if(!background){intstatus;waitpid(pid,&status,0);}else{printf("[后台作业] pid = %d\n",pid);// 可以不 wait,让它成为孤儿进程,由 init 回收// 或者后续用 waitpid(-1, ...) 非阻塞回收}}printf("\nbye~\n");return0;}

编译 & 运行

gcc -o myshell myshell.c ./myshell

然后就可以输入:

myshell$ ls -l myshell$ sleep 10 & myshell$ pwd myshell$ cd /tmp myshell$ exit

进阶功能(按难度递增)

优先级功能关键实现点难度
★☆☆支持管道 `cmd1cmd2`fork 两次 + pipe() + dup2
★★☆支持重定向> >> <解析 > >> <,用 open() + dup2★★★
★★☆回收所有后台进程(waitpid)非阻塞 waitpid(-1, &status, WNOHANG) 循环★★
★★★支持&&``
★★★实现!历史命令保存历史链表,按 !n 执行★★★
★★★★支持环境变量展开$HOME解析 $ 开头的词,用 getenv() 替换★★★★
★★★★支持通配符 * ?用 glob() 或自己实现匹配★★★★★

推荐进阶顺序(比较实用)

  1. 先把上面的极简版跑通
  2. 加上后台进程的非阻塞回收(每轮循环末尾试一次 waitpid(-1, …, WNOHANG))
  3. 实现最简单的重定向(只支持><
  4. 再实现单级管道(最有成就感)

小提示

  • 解析命令行时建议用strtok_r()(可重入版本)更安全
  • 处理输入时考虑连续空格、tab、行首尾空格
  • execvp() 失败时退出码常用 127(command not found)
  • 后台进程结束时如果不回收,会出现僵尸进程(zombie)

如果你现在想继续做这个项目,可以告诉我你想先实现哪个功能(管道、重定向、后台回收、历史命令……),我可以给你对应的核心代码片段和注意事项。

祝你写出一个属于自己的 shell~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/4 17:42:02

一觉醒来,Clawdbot突然操纵电脑开口说话了

来源&#xff1a;机器之心 本文约1500字&#xff0c;建议阅读5分钟AI&#xff1a;我寻思你有这个需求。 近期&#xff0c;AI 圈最火的当属可以 24 小时自动运行的「Clawdbot」&#xff01; 这个智能体助手是真的能帮你干活&#xff0c;它已经引走了 AI 圈的大半注意力。甚至因为…

作者头像 李华
网站建设 2026/5/5 5:00:49

150万AI聚在一个论坛,人类只配围观,我慌了

这两周的周末绝对是科技圈最火的两个周末。 上周末&#xff0c;也就是一周之前&#xff0c;OpenClaw &#xff08;曾用名&#xff1a;Clawdbot&#xff09;火爆全球&#xff0c;因为太火了&#xff0c;一周三次更名。为什么会这么频繁更名呢&#xff1f;人红是非多啊&#xff0…

作者头像 李华
网站建设 2026/5/5 5:00:47

如果重来一次,你还会选机器视觉吗?

刚入行机器视觉的时候&#xff0c;我一直以为这是个拼技术的活。后来才发现&#xff0c;真正折磨人的&#xff0c;从来不是算法&#xff0c;而是现场。 有一次项目抓图老是失败&#xff0c;我在那疯狂排查代码&#xff0c;结果到现场一看—— 网线被折成了死角。 信号不稳&…

作者头像 李华
网站建设 2026/5/5 5:00:45

收藏备用|程序员/小白入门大模型不踩坑!转行+学习全攻略

这两年&#xff0c;大模型彻底走出实验室的“象牙塔”&#xff0c;从高冷的技术研究&#xff0c;走进了每一位程序员、学生、转行者的日常工作和职业规划里。无论是后端开发、前端工程师&#xff0c;还是零基础想入行的小白&#xff0c;几乎都在关注大模型这个风口。 后台每天都…

作者头像 李华
网站建设 2026/5/5 5:00:43

<span class=“js_title_inner“>“AI+” 实效落地指南|天云数据四大场景攻坚方案,为能源/消防/交通/康养精准赋能</span>

近期&#xff0c;国务院新闻办举行发布会&#xff0c;指出人工智能是新一轮科技革命和产业变革的重要驱动力量&#xff0c;是引领未来的战略性和基础性技术。接下来&#xff0c;将推进“AI”专项行动聚焦能源、制造等重点行业&#xff0c;推动超千个高价值场景落地生根。各产各…

作者头像 李华
网站建设 2026/5/8 12:45:37

从参数竞赛到物理世界理解:2026 年 AI 技术的三大进化方向

引言 当我们还在为大模型参数突破万亿级惊叹时,AI 行业的竞争焦点已经悄然转向。2026 年开年,一场新的技术风暴正在酝酿:谷歌 DeepMind 和北京智源的前沿模型登上《自然》期刊,ASC26 竞赛把 "秒级物理世界推理" 设为核心赛题,雄安新区发布专为工业场景打造的 &…

作者头像 李华