将程序附加到进程stdout / stderr

时间:2011-10-21 12:46:34

标签: c unix process

我有一个程序,我需要附加到给定pid的stdout / stderr(从文件中获取)。 应该怎么做?这甚至可能吗?

编辑1:

我有一个启动/停止服务器程序的监控程序。但是,可以关闭/重新打开监视器,并且应该挂钩到现有的服务器标准输出以读取写在stdout上的错误(以及基于某些监视器请求的某些输出)。

编辑2:

我构建了服务器和监视器所以我有两者的来源,问题是服务器“回答”stdout上的一些监视器请求,我不想添加另一个进程间通信部分

3 个答案:

答案 0 :(得分:2)

当一个进程正在运行时,没有一种标准的Unix方法来拦截来自另一个进程的输出,并在目标进程启动后开始捕获它。

如果您是通过execve自行启动这些流程,则只需通过pipe(2)设置管道,并将其描述符(通过dup2(2))重定向到子流程' stdin和stdout。这样父母就可以通过管道写入/读取孩子的stdin / stdout。

关于编辑后的问题:这似乎非常适合Unix fifo文件。

fifo文件(或命名管道)看起来像文件,但是作为发动机罩下的管道实现。

所以只需创建一个fifo文件(使用mkfifo(1)命令),通过将其stdin和stdout描述符重定向到该文件来启动服务器应用程序(使用<>运算符shell),你随时都可以阅读它。

答案 1 :(得分:1)

从未尝试过,但如果可以(具有适当的权限)附加到那里的文件描述符条目,您可以查看/ proc / $ pid /目录。否则我无法想象这是怎么可能的。


编辑(获取更多详细信息后)

您声明,您的流程将可以启动/停止该服务器流程 - 这使事情变得更加容易:)

由于这是作业,我只是画出画面:

  • 为服务器的 stdin stdout 创建命名管道

  • 启动服务器时,将 stdin / stdout 连接到命名管道

  • 启动客户端时,从/向命名管道读取/写入

答案 2 :(得分:0)

您是否可以选择配置服务器,以便将输出发送到日志文件,或者除了stdout之外?在unix框中,您可以通过tee运行服务器以将stdout记录到文件中:

$ server | tee server.log

然后拖尾server.log来获取最新的输出是一件简单的事情。

$ tail -f server.log