运行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
相关产品推荐
相关产品推荐

