You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行子进程返回父进程后index未更新及HistoryBrief打印异常排查

简易Shell实现问题及解决方案

项目基础信息

我正在实现一款支持命令历史记录、可读取进程批处理文件作为输入执行的简易Shell,核心设计与代码结构如下:

  • 核心结构体定义
    • Proc_t:存储进程相关信息
    • his_t:用于构建双向链表存储命令历史记录
  • 代码文件拆分
    • head.h:公共头文件,存放结构体定义、函数声明、公共依赖引入
    • main.c:Shell主逻辑实现
    • history.c:命令历史相关操作实现
    • process.c:进程创建、执行相关逻辑实现

复现条件

测试用批处理文件为每行一条Linux命令的文本文件,内容如下:

ls -al
echo Hello World
touch newfile.c
ps


异常问题及修复方案

问题1:fork后父子进程index值不同步

现象:调用fork()创建子进程执行命令后,父进程中修改的index值未同步到子进程
根因:fork()创建子进程后,父子进程拥有独立的虚拟地址空间,遵循写时复制机制,父进程对变量的修改不会同步到子进程的地址空间中
修复方案:

  • 如果子进程仅需要执行命令前的index值:将index的更新操作放到fork()调用之前,子进程可以直接拿到最新的index值
  • 如果需要父子进程运行时动态同步index:使用共享内存存储index变量,可通过mmap(MAP_SHARED)或者System V共享内存实现

问题2:HistoryBrief()打印所有历史命令均为ps

现象:调用HistoryBrief()打印命令历史时,4条测试命令全部输出ps而非各自的命令内容
根因:存储命令历史时仅对命令字符串做了浅拷贝,所有his_t节点的命令指针都指向同一个读命令缓冲区,后续读入的命令会覆盖缓冲区原有内容,最终所有节点都指向最后读入的ps命令
修复方案:
每次读取到新命令存入历史链表前,对命令字符串做深拷贝:

// 错误写法(直接赋值指针,浅拷贝)
new_node->cmd = read_buf;
// 正确写法1:用strdup直接实现深拷贝
new_node->cmd = strdup(read_buf);
// 正确写法2:自行实现内存申请+拷贝
new_node->cmd = malloc(strlen(read_buf)+1);
strcpy(new_node->cmd, read_buf);

注意程序退出时要遍历历史链表释放每个节点的cmd字符串,避免内存泄漏。

内容的提问来源于stack exchange,提问作者qascade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:24:03