C#处理:使用管道/文件描述符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#处理:使用管道/文件描述符相关的知识,希望对你有一定的参考价值。

我正在尝试连接到Chromium in the same way Puppeteer does in NodeJS

这看起来super simple in NodeJS。您向stdio数组添加了两个参数,并且您拥有管道。

我无法在Puppeteer-Sharp中实现相同的逻辑。我花了一些时间在这里阅读许多问题和答案。我读到了AnonymousPipeServerStream,但没有快乐。

这是我无法使其工作的一个例子:

AnonymousPipeServerStream streamReader = new AnonymousPipeServerStream(PipeDirection.In, HandleInheritability.Inheritable);
AnonymousPipeServerStream streamWriter = new AnonymousPipeServerStream(PipeDirection.Out, HandleInheritability.Inheritable);

var chromeProcess = new Process();
chromeProcess.EnableRaisingEvents = true;
chromeProcess.StartInfo.UseShellExecute = false;
chromeProcess.StartInfo.FileName = "/.local-chromium/MacOS-536395/chrome-mac/Chromium.app/Contents/MacOS/Chromium";
chromeProcess.StartInfo.Arguments = 
    "--MANY-MANY-ARGUMENTS  " +
    "--remote-debugging-pipe  " +
    "--user-data-dir=/var/folders/0k/4qzqprl541b74ddz4wwj_ph40000gn/T/mz0trgjc.vlj " +
    "--no-sandbox " +
    "--disable-dev-shm-usage " + 
    streamReader.GetClientHandleAsString() +
    streamWriter.GetClientHandleAsString();

chromeProcess.Start();

streamReader.DisposeLocalCopyOfClientHandle();
streamWriter.DisposeLocalCopyOfClientHandle();

Task task = Task.Factory.StartNew(async () =>
{
    var reader = new StreamReader(streamReader);
    while (true)
    {
        var response = await reader.ReadToEndAsync();

        if (!string.IsNullOrEmpty(response))
        {
            Console.WriteLine(response);
        }
    }
});

Console.ReadLine();

许多例子表明你必须传递GetClientHandleAsString()作为参数,但我不知道它如何连接到进程。

这是the full example的要点

答案

答案在于用Process启动ProcessStartInfoRedirectStandardInput具有RedirectStandardOutputRedirectStandardError和/或Process.StandardInput属性集,然后使用Process.StandardOutputProcess.StandardError和/或qazxswpoi属性来访问管道。

以上是关于C#处理:使用管道/文件描述符的主要内容,如果未能解决你的问题,请参考以下文章

C - 将标准输入/输出重定向到单个双向文件描述符

Linux系统学习之字符处理

为啥父进程必须在调用wait()之前关闭管道的所有文件描述符?

dup2 错误的文件描述符错误

文件管理命令

Linux文件管理命令