【问题标题】:Other programs in pipe管道中的其他程序
【发布时间】:2013-06-22 08:52:24
【问题描述】:

如果使用管道调用程序PROG

progA | progB | PROG | progC ...

有没有办法告诉它是在什么上下文中调用的 - 即从/到它正在接收或发送管道输出的其他程序(A、B、C...)?

我最感兴趣的是PROG 的前身(在上面的示例中,progB),但我也对更一般的问题感到好奇。

【问题讨论】:

  • 可以做到,是的,但不容易,而且(如 l0b0 所说)不可移植。
  • 什么是更大或潜在的问题,这样您认为这是您需要的?
  • @CharlesDuffy : PROG 有点像grcat/grc,理想情况下会根据它了解以前的程序而不是文件扩展名。
  • @user2141650 您最安全的方法是要求调用者向管道的每个组件指示输入类型。没什么好玩的,但其他任何事情都将是不可移植的、脆弱的猜测。

标签: c shell pipe


【解决方案1】:

如果您使用的是 Linux,则可以使用 /proc filesystem 检查命令如何通过管道进行通信。但是,这并不是真正的便携。

【讨论】:

  • 我会等着看是否有更多可移植的解决方案出现,否则您的 shell 脚本非常有帮助。如果先前的程序退出,它看起来好像不起作用。不幸的是,因为如果您将一个程序通过管道传输到另一个具有例如总线错误,您将收到一个错误,显示管道的所有元素,无论它们是否退出。要是内核能够公开它显然知道的东西就好了……
  • 感谢您的提示。我也很想知道您的问题的答案,以便继续开发脚本。
【解决方案2】:

您可以使用ps 显示所有具有相同父进程的进程。例如,如果 PROG 有 pid PID,在 Linux 上你可以这样做:

ps --ppid $(ps -o ppid= $PID)

获取管道中所有命令的列表。 (实际上,您将获得调用管道的 shell 的所有子命令,这可能就足够了。您可以检查每个命令的进程组以确定哪些实际在管道中。)它们的顺序print 不一定是它们在管道中出现的顺序,你可以在/proc/pid/fd 中查看每个进程的输入的inode 以确定它们的排列方式。

【讨论】:

    猜你喜欢
    • 2021-09-28
    • 2021-03-27
    • 2012-06-13
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 2023-03-29
    • 2016-08-11
    相关资源
    最近更新 更多