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),导致输入流混乱,引发卡顿。正确流程应为:- 创建管道或临时文件;
- 将收集到的内容写入管道写端/临时文件;
- 将目标命令的stdin重定向到管道读端/临时文件;
- 再执行
execve启动命令。
内容的提问来源于stack exchange,提问作者Dani Cruz
相关产品推荐
相关产品推荐

