如果我这样做:
x | y
Run Code Online (Sandbox Code Playgroud)
有没有办法在 x 运行时检查它是否连接到 y?请注意,我不知道 y 是什么,并且我不负责启动 y。
具体来说,我谈论的是 Node.js 运行时,所以这可能是 Node.js 特定的问题。但最终,我想知道是否可以确定给定的任何运行时间。这可能吗?如何实现?
是否可以确定 stdout/stderr 是否连接到另一个进程的 stdin?我想这就是这个问题的目的。
要检查程序的输出是否进入管道,基于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 stat
S_ISFIFO
如果您喜欢浪费 CPU 周期并想要使用外部二进制文件,您可以执行test -p /dev/fd/$THE_FD
来获取答案(或者在 shell 中调用该答案,其中test
将是内置函数,或者 run stat
,或者启动其他能够确定文件类型的东西)。