我如何像这个 perl 代码一样将 null 传递给标准输入?

Posted

技术标签:

【中文标题】我如何像这个 perl 代码一样将 null 传递给标准输入?【英文标题】:How do i pass null into stdin like this perl code? 【发布时间】:2010-03-18 16:58:36 【问题描述】:

This is my question 显然是 this is the answer。原来这是一个缓冲区问题(我的 ffmpeg 链接的接受答案中的解决方案)而不是标准输入。我发现您可以通过在命令提示符中写入 > NUL 来将标准输出为 null,因此我尝试在参数末尾写入

我如何传入 null 或像 perl 代码那样对 IO 锁做一些事情,这样我才能让我的 ffmpeg 脚本在 15 秒左右后不被锁定?注意:我必须让 std out 和 err 来检查失败。

【问题讨论】:

【参考方案1】:

更新:之前的回复是关于如何关闭从 Perl 产生的进程上的标准输入,但问题实际上是关于如何在 .NET 中执行任务。

这个想法是一样的。您想关闭新进程的标准输入流的句柄。在 .NET 中,可以使用

app.StandardInput.Close()

在呼叫app.Start()之后立即。

(我认为您还想设置 app.StartInfo.RedirectStandardInput = true,但我不是一个 .NET 程序员,对此我不确定)。


NUL 是 Windows 约定,类似于 Unix 的 /dev/null。但在 Unix 上,> NUL 将创建一个名为 "NUL" 的文件,而 < NUL 将导致您的系统调用(即system、反引号等)失败,除非有一个名为 "NUL" 的文件。

也就是说,Perl 中有一些可移植的方法来关闭衍生进程的标准输入。例如:

open $fh, "| $command > outputfile 2> errorfile";
close $fh;

将启动$command 并立即关闭$command 的标准输入句柄,就像您从命令行运行命令并立即点击^D

【讨论】:

开放进程调用的更安全、更现代的习惯用法是open $fh, '|-', "$command ..." 这一切都很好,但我在 Windows 上,我需要执行类似 perl 代码的操作,因此 ffmpeg 将 F@#$%ing 完成并且不会锁定。什么部分导致 STDIN 为空是 |- 部分(或 |)?我正在使用.NET,并且我已经在设置属性以重定向标准输出和错误。 fh是什么?在 .NET 中,我指定了 exe 和参数。 |似乎在exe前面,这让我感到困惑。 -edit- +1 为您的非正式回答。 这个答案完全正确! stdin 与它无关,我现在对 nul 和 std 了解更多

以上是关于我如何像这个 perl 代码一样将 null 传递给标准输入?的主要内容,如果未能解决你的问题,请参考以下文章

perl中的' b'字符如何工作?

如何像未定义的函数一样传递未定义的方法

如何在 Dapper Query 的动态参数中传递多个条件,就像我们为 IN 运算符传递的一样

Perl - 我如何将完整的目录路径名传递给 perl 脚本

如何将数据从 Perl 传递到 Java?

如何像使用 axios auth 选项一样通过 apollo 客户端传递应用程序凭据