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

Linux环境下向进程STDIN(文件描述符0)模拟输入失败问题咨询

为什么直接写入/proc/<pid>/fd/0无法给Python程序传递输入?

嘿,我来帮你搞清楚这个问题——你尝试的操作确实不可行,下面给你拆解原因和可行的解决方案:

核心原因:/proc/<pid>/fd/0不是你想的那样

当你的Python程序通过终端启动时,它的STDIN(FD 0)其实是一个指向终端设备(比如/dev/pts/2)的符号链接。你执行echo "Test" >> /proc/<pid>/fd/0时,本质上是直接往终端设备文件里写内容,终端会把这些内容回显在屏幕上,但不会把它们作为输入传递给你的Python进程。

这是因为终端设备的输入缓冲区是由终端驱动管理的,只有真正的用户交互输入(或者终端模拟工具的输入)才会被进程的sys.stdin读取到,直接写入设备文件并不符合终端的输入机制。

可行的解决方案

方案1:用命名管道(FIFO)重定向STDIN

这是最直接的方法,步骤如下:

  1. 先创建一个命名管道:
    mkfifo my_input_pipe
    
  2. 启动你的Python程序,把STDIN重定向到这个管道:
    python your_script.py < my_input_pipe
    
  3. 在另一个终端,往管道里写入数据:
    echo "Test" > my_input_pipe
    
    这时候你的Python程序就能读取到"Test"并打印Echoing: Test了。

方案2:用GDB给运行中的进程注入输入

如果你的程序已经在运行中,不想重启它,可以用GDB直接给进程的STDIN写入数据:

  1. 找到进程的PID(你已经知道了),启动GDB并attach到进程:
    gdb -p <你的进程PID>
    
  2. 在GDB的命令行里,调用系统的write函数往FD 0写入数据(注意要包含换行符,因为你的代码是按行读取的):
    call write(0, "Test\n", 5)
    
  3. 执行完后,输入detach脱离进程,再输入quit退出GDB。这时候你的Python程序应该会输出Echoing: Test。

方案3:用终端模拟工具(比如expect)

如果你需要更复杂的交互模拟,可以用expect工具来模拟终端输入:

  1. 先安装expect(比如apt install expect)
  2. 写一个简单的expect脚本(比如send_input.exp):
    spawn python your_script.py
    send "Test\n"
    interact
    
  3. 运行脚本:
    expect send_input.exp
    
    这个脚本会启动你的程序并自动发送"Test"作为输入。

总结

直接写入/proc/<pid>/fd/0本质是往终端设备写回显,而非给进程传输入。通过重定向到管道、用GDB注入或者终端模拟工具,才能真正让进程读取到你发送的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:17:35