首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从外部进程向已有进程的STDIN写入数据?

如何从外部进程向已有进程的STDIN写入数据?
EN

Stack Overflow用户
提问于 2011-03-21 13:46:58
回答 1查看 32.2K关注 0票数 28

我正在寻找从外部进程向现有进程的STDIN写入数据的方法,并在stackoverlow中发现了类似的问题How do you stream data into the STDIN of a program from different local/remote processes in Python?

在线程中,@Michael说我们可以在如下所示的路径中获取现有进程的文件描述符,并允许在Linux上向其中写入数据。

/proc/$PID/fd/

因此,我创建了一个简单的脚本,如下所示,用于测试从外部进程向脚本的STDIN (和TTY)写入数据。

#!/usr/bin/env python

import os, sys

def get_ttyname():
    for f in sys.stdin, sys.stdout, sys.stderr:
        if f.isatty():
            return os.ttyname(f.fileno())
    return None

if __name__ == "__main__":
    print("Try commands below")

    print("$ echo 'foobar' > {0}".format(get_ttyname()))
    print("$ echo 'foobar' > /proc/{0}/fd/0".format(os.getpid()))

    print("read :: [" + sys.stdin.readline() + "]")

这个测试脚本显示了STDINTTY的路径,然后等待一个测试脚本写入它的STDIN

我启动了这个脚本,得到了下面的消息。

Try commands below
$ echo 'foobar' > /dev/pts/6
$ echo 'foobar' > /proc/3308/fd/0

因此,我从其他终端执行命令echo 'foobar' > /dev/pts/6echo 'foobar' > /proc/3308/fd/0。在执行这两个命令之后,消息foobar在运行测试脚本的终端上显示两次,但仅此而已。未执行行print("read :: [" + sys.stdin.readline() + "]")

是否有任何方法可以将数据从外部进程写入现有进程的STDIN (或其他文件描述符),即从其他进程调用行print("read :: [" + sys.stdin.readline() + "]")的执行?

EN

回答 1

Stack Overflow用户

发布于 2015-09-18 11:24:08

我想在这里留下一个我认为有用的例子。这是对上面的while true技巧的轻微修改,它在我的机器上间歇性地失败。

# pipe cat to your long running process
( cat ) | ./your_server &
server_pid=$!
# send an echo to your cat process that will close cat and in my hypothetical case the server too
echo "quit\n" > "/proc/$server_pid/fd/0"

这对我很有帮助,因为由于特殊的原因,我不能使用mkfifo,它非常适合这个场景。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5374255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档