Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 管道中的其他程序_C_Shell_Pipe - Fatal编程技术网

C 管道中的其他程序

C 管道中的其他程序,c,shell,pipe,C,Shell,Pipe,如果使用管道调用程序PROG progA | progB | PROG | progC ... 有没有一种方法可以告诉它是在什么上下文中被调用的?例如,从/到什么其他程序(a、B、C…),它正在接收或发送管道输出 我最感兴趣的是PROG(在上面的示例中,progB)的直接前身,但我也对更一般的问题感到好奇。如果您使用的是Linux,那么可以使用检查命令如何通过管道进行通信。但是,这不是真正的可移植性。如果您在Linux上,您可以使用检查命令如何通过管道进行通信。但是,这不是真正的可移植性。您可

如果使用管道调用程序
PROG

progA | progB | PROG | progC ...
有没有一种方法可以告诉它是在什么上下文中被调用的?例如,从/到什么其他程序(a、B、C…),它正在接收或发送管道输出


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

如果您使用的是Linux,那么可以使用检查命令如何通过管道进行通信。但是,这不是真正的可移植性。

如果您在Linux上,您可以使用检查命令如何通过管道进行通信。但是,这不是真正的可移植性。

您可以使用
ps
显示具有相同父进程的所有进程。例如,如果PROG具有pid,则在Linux上可以执行以下操作:

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

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

您可以使用
ps
显示具有相同父进程的所有进程。例如,如果PROG具有pid,则在Linux上可以执行以下操作:

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

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

这可以做到,是的,但不容易,而且(正如l0b0所说)不可移植。更大或根本的问题是什么,以至于这是你认为需要的东西?@CharlesDuffy:
PROG
有点像,理想情况下会是这样“着色”(实际上不是它的功能,但也没有相关的区别)基于它对以前的程序而不是文件扩展名的了解。@user2141650最安全的方法是要求调用者指出管道中每个组件的输入类型。这不太有趣,但其他任何事情都将是不可移植的、脆弱的猜测。这可以做到,是的,但不容易做到(正如l0b0所说)不可移植。更大或根本的问题是什么,以至于这是您认为需要的东西?@CharlesDuffy:
PROG
有点像,理想情况下会“着色”(实际上不是它的功能,但也没有相关的不同)基于它对以前的程序而不是文件扩展名的了解。@user2141650最安全的方法是要求调用方指示管道中每个组件的输入类型。这不是什么有趣的事情,但任何其他事情都将是不可移植的、脆弱的猜测。我将等待看是否有更多的可移植解决方案出现,但你的shell脚本非常有用。如果前一个程序退出,它看起来就不起作用了。不幸的是,如果你将一个程序通过管道传输到另一个有总线错误的程序,你会得到一个错误,显示管道中的所有元素,不管它们是否退出。如果内核能够公开它显然知道的内容,那就好了……谢谢提示。我还真的很想知道你的问题的答案,以便继续开发脚本。我会等着看是否有更多的可移植解决方案出现,但你的shell脚本非常有用。如果前一个程序退出,它看起来似乎无法工作。不幸的是,如果你将一个程序传输到另一个程序,例如出现总线错误,y您将得到一个错误,显示管道的所有元素,无论它们是否已退出。如果内核能够公开它显然知道的内容,那该多好啊……感谢您的提示。我还非常想知道您问题的答案,以便继续开发脚本。