如何在freopen()后通过Bash分两次重定向程序的stdin输入?
解决方法
核心思路是利用**伪终端(PTY)**模拟程序的终端输入,让freopen("/dev/tty")指向我们提供的菜单文件,而非真实终端。以下是几种通用方案:
方案1:使用script命令(最通用,无需额外工具)
script命令会创建一个伪终端,让程序运行在该终端环境中,同时我们可以将菜单文件作为script的输入,替代真实终端的交互:
script -q /dev/null -c './your_program < longInput.txt' < menu.txt
解释:
-q /dev/null:让script静默运行,不生成日志文件-c './your_program < longInput.txt':指定要运行的程序,同时将longInput.txt重定向为程序的初始stdin< menu.txt:将菜单文件作为script的stdin,当程序调用freopen("/dev/tty")后,会从这个输入读取菜单选项
方案2:使用expect脚本(适合更复杂的交互场景)
如果需要更精细控制输入时机,可以用expect脚本模拟终端交互:
#!/usr/bin/expect # 启动程序并将初始stdin指向longInput.txt spawn ./your_program < longInput.txt # 等待程序完成初始输入读取,进入菜单交互阶段 # 根据程序实际输出调整匹配规则,比如程序输出"请选择菜单:"时发送文件内容 expect "请选择菜单:" # 将menu.txt的内容发送给程序 send_file "menu.txt" # 保持交互(如果需要后续手动操作) interact
保存为feed_input.exp,赋予执行权限后运行:
chmod +x feed_input.exp ./feed_input.exp
方案3:使用pty工具(部分系统预装)
如果系统有pty工具,可以直接指定菜单文件作为终端输入:
pty -w menu.txt ./your_program < longInput.txt
关键原理
程序调用freopen("/dev/tty")时,会尝试连接当前进程的控制终端。通过伪终端工具(script/expect/pty),我们可以替换这个控制终端的输入源为菜单文件,从而实现不修改源码的情况下,将第二个文件定向为程序的终端输入。
内容的提问来源于stack exchange,提问作者Owen Sullivan
相关产品推荐
相关产品推荐

