确定进程是否通过管道“连接”到另一个进程

Ale*_*lls 5 pipe node.js

如果我这样做:

x | y
Run Code Online (Sandbox Code Playgroud)

有没有办法在 x 运行时检查它是否连接到 y?请注意,我不知道 y 是什么,并且我不负责启动 y。

具体来说,我谈论的是 Node.js 运行时,所以这可能是 Node.js 特定的问题。但最终,我想知道是否可以确定给定的任何运行时间。这可能吗?如何实现?

是否可以确定 stdout/stderr 是否连接到另一个进程的 stdin?我想这就是这个问题的目的。

PSk*_*cik 4

要检查程序的输出是否进入管道,基于https://nodejs.org/api/fs.html#fs_class_fs_stats,您需要调用fs.fstat(FileDescriptor)然后调用isFIFO()返回的stat对象(FIFO ==first-in-first -out == 管道或命名管道):

$ </dev/null node -e 'var fs=require("fs");
   fs.fstat(0,function(err,stats){ if(err) throw(err); console.log(stats.isFIFO()); });  ' 
  false
$  : | node -e 'var fs=require("fs");
   fs.fstat(0,function(err,stats){ if(err) throw(err); console.log(stats.isFIFO()); });  ' 
  true
Run Code Online (Sandbox Code Playgroud)

在 C 中,您将进行fstat系统调用,然后使用宏测试.st_mode返回的字段。struct statS_ISFIFO

如果您喜欢浪费 CPU 周期并想要使用外部二进制文件,您可以执行test -p /dev/fd/$THE_FD来获取答案(或者在 shell 中调用该答案,其中test将是内置函数,或者 run stat,或者启动其他能够确定文件类型的东西)。