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

C语言实现bash中<<重定向时终端卡顿问题排查

问题:实现bash << 重定向时终端卡顿的排查

我正在用C语言开发一个minishell,需要实现bash中的<<重定向命令——将终端输入内容重定向至标准输入,但目前遇到问题:

  • 预期效果:输入cat << deli后,输入多行内容再输入deli,cat会输出内容且终端正常
  • 实际现象:输出内容后终端卡顿

相关代码如下:

buffer = readline("> ");
while (strncmp(buffer, delimiter, ft_strlen(buffer)) != 0)
{
    str = ft_strjoin(str, ft_strjoin("\n", buffer);
    free(buffer);
    buffer = readline("> ");
}
write(0, str+1, ft_strlen(str));

其中readline()用于读取每行输入直到分隔符,ft_strjoin用于拼接字符串。最后尝试将读取的内容写入stdin,之后通过execve执行cat等进程。请问这段代码存在什么问题?


问题分析与修复建议

  • 错误操作标准输入流:stdin是程序的只读输入流,用write(0, ...)往stdin写入数据完全不符合逻辑。bash的<<重定向是让后续命令从你收集的内容(直到分隔符)读取,而非把内容写回stdin。正确做法是通过管道或临时文件,将收集的内容作为目标命令的标准输入源。

  • 字符串拼接存在语法错误与内存泄漏:

    • 代码中ft_strjoin("\n", buffer)缺少右括号,属于语法错误,编译时会报错。
    • 每次调用ft_strjoin生成的中间字符串(比如ft_strjoin("\n", buffer)的返回值)未被释放,会造成内存泄漏。
    • 若str初始化为空指针,第一次调用ft_strjoin(str, ...)可能触发未定义行为,需先将str初始化为空字符串(比如str = ft_strdup(""))。
  • strncmp参数逻辑错误:strncmp(buffer, delimiter, ft_strlen(buffer))的第三个参数是buffer的长度,若delimiter比buffer短,即使buffer前缀与delimiter完全匹配,也会被判定为不相等。正确写法应该是用strncmp(buffer, delimiter, ft_strlen(delimiter)),同时额外判断buffer的长度是否等于delimiter的长度,避免误判。

  • 终端卡顿的根本原因:往stdin写数据后,execve启动的cat进程仍会尝试从终端读取输入(因为你未正确重定向它的stdin),导致输入流混乱,引发卡顿。正确流程应为:

    1. 创建管道或临时文件;
    2. 将收集到的内容写入管道写端/临时文件;
    3. 将目标命令的stdin重定向到管道读端/临时文件;
    4. 再执行execve启动命令。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:50:43