【问题标题】:How to write to cygwin pipe from c#如何从 C# 写入 cygwin 管道
【发布时间】:2019-10-06 22:53:27
【问题描述】:

我想用“tail -f”创建一个可以在 cygwin 管道中使用的 c# 应用程序。

tail -f SomeFile | MyCSharpApp

我可以看到(通过调试)我能够正确读取 stdinput,但没有任何内容回写到 cygwin 终端窗口。

然而,

tail -n10 一些文件 | MyCSharpApp

完美运行。

class Program
{
    static void Main(string[] args)
    {

        string s;
        while ((s = Console.ReadLine()) != null)
        {
           //Potentially process s here
           Console.WriteLine(s);
        }
    }
}

【问题讨论】:

  • 所以这不是 C# 问题
  • @MarcoSalerno 我认为是。当我不在管道中包含我的应用程序时,tail -f 和 tail -n10 都可以工作。
  • Cygwin,呵呵,天啊哟。首先 Slurp 所有输入,这样您就不会在管道缓冲区大小上死锁。
  • @HansPassant 你能建议我如何在 Tail -f 连续的情况下做到这一点吗?
  • 我对您帖子中的这句话感到困惑:“我可以看到(从调试中)我能够正确读取 stdinput,但没有任何内容回写到 cygwin 终端窗口。”当您说您能够正确读取标准输入时,您是什么意思? Console.ReadLine 是否返回信息?出于好奇,您是否尝试过 Console.Read 而不是 Console.ReadLine?

标签: c# pipe cygwin


【解决方案1】:

目前尚不清楚 SomeFile 发生了什么。 tail -f SomeFile 打开 SomeFile 文件描述符并监视它。如果描述符以某种方式更改,例如,您在记事本中打开文件并单击“保存”,则不会监控任何内容。发生这种情况是因为记事本删除了文件并写入了同名的新文件。我建议尝试tail -F SomeFile-F 重新打开一个文件描述符。

【讨论】:

  • 我都试过了——同样的问题。该文件是一个不断更新的日志文件。
【解决方案2】:

编辑:这个答案写错了关于问题的反面。也就是说,它是为尝试myApp > tail -f 而写的,而不是tail -f file.txt > myApp

tail -f 作用于文件而不是管道。我可以让它输出另一个命令的输出的唯一方法是如果我使用tail -F <(ls -lthr),其中ls -lthr 可以是任何打印输出的命令。

让我们想想为什么会这样。 tail 打印文件的内容(尤其是末尾的行)。如果您能够打印到控制台或标准输出,则不需要tail

额外:此外,如果您决定需要输出到文件中,那么您可以简单地使用> file.txt 将该控制台输出放入文件中。

【讨论】:

  • 我需要tail,因为这是一个不断更新的日志文件
  • @ManInMoon 不知何故,我设法完全让你的意图倒退了。我以为你试图通过尾部输出而不是通过尾部输入。您尝试做的问题是管道将数据作为参数提供给下一个命令。这是一次完成,而不是以持续的方式完成。对于您的应用程序来说,间歇性地检查文件是否有更改可能是一个更好的主意。一旦您知道上次检查的最后一行编号,您就可以从下一行开始。我实际上从未见过任何建议通过管道输出“tail -f”
  • 看看这个似乎回答了真正问题的问题:superuser.com/questions/742238/piping-tail-f-into-awk
猜你喜欢
  • 1970-01-01
  • 2021-04-09
  • 2012-01-28
  • 1970-01-01
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多