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

运行C程序时expect报错spawn id exp5 not open是什么原因?

错误原因

  • 被测C程序的标准输出缓冲模式受运行环境影响:手动运行时stdout绑定交互式终端,默认采用行缓冲,printf输出带换行的内容会立即刷新到输出流;被Expect spawn启动时,stdout绑定的是管道,默认采用全缓冲,只有缓冲区满、主动调用fflush或进程退出时才会输出缓冲内容。
  • 你的程序输出两行内容后调用fgets()等待输入,此时输出内容还停留在缓冲区未被送出,Expect无法匹配到对应字符串;如果被测程序因fgets()调用异常、逻辑错误等原因提前终止,对应的spawn文件描述符会被关闭,执行下一个expect语句时就会抛出spawn id not open错误。

解决方案

方案1:修改被测程序(最稳定)

在所有printf语句之后、调用fgets()之前添加fflush(stdout);,强制刷新输出缓冲区,保证内容能及时被Expect接收:

printf("Type command and argument/s.\n");
printf("exit\n");
fflush(stdout); // 新增该行强制刷新缓冲
fgets(buf, sizeof(buf), stdin);

方案2:修改Expect脚本(无需改动被测代码)

给spawn命令添加-pty参数,为被测进程分配伪终端,让进程认为自己运行在交互式环境中,自动切换为行缓冲模式:

spawn -pty ./$programName first_fit $filename

方案3:添加调试逻辑定位异常

如果修改后仍有问题,可在Expect脚本开头添加exp_internal 1开启调试日志,查看Expect实际接收的输出内容和进程状态,确认是否为被测程序提前崩溃、路径错误等其他问题导致的异常。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:45:06