【问题标题】:Can't write input to process C# Mono无法写入输入来处理 C# Mono
【发布时间】:2013-03-14 00:43:34
【问题描述】:

我在尝试将输入写入 linux 进程时遇到问题。代码如下:

        System.Diagnostics.Process process = new System.Diagnostics.Process();
        process.StartInfo.WorkingDirectory = "'/home/"+user+"/pacotes/"+nome_pacote.Text+"-1.0/'";
        process.StartInfo.FileName="dh_make";
        process.StartInfo.Arguments="-n -s";
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardInput = true;
        process.Start();
        Thread.Sleep(3000);
        process.StandardInput.WriteLine();

这是错误:

System.IO.IOException:路径 /home/vinholi/Ubuntu One/Uso do linux em flash drive/Programa gerador de .deb/GeradorDeb/GeradorDeb/bin/Debug/[未知] 上的写入错误 在 System.IO.FileStream.FlushBuffer (System.IO.Stream st) [0x00000] in :0 在 System.IO.FileStream.FlushBuffer () [0x00000] in :0 在 System.IO.FileStream.Dispose (Boolean disposing) [0x00000] in :0

【问题讨论】:

  • 您的堆栈跟踪与您发布的代码不相关。为什么?
  • 对不起柯克沃尔,但我不明白你的意思。请注意我是初学者。
  • 我的意思是您的堆栈跟踪不包含您的任何代码。
  • 错误表示存在写入错误。我认为它指的是我的代码的最后一行,我试图在其中写一行或将一行跳转到我的进程中。
  • 堆栈跟踪确实与问题相关,请参阅下面的答案。

标签: c# linux shell mono


【解决方案1】:

此错误的一个可能解释是进程在您尝试写入之前已退出。我用/bin/date 和合法的StartInfo.WorkingDirectory 尝试了这个,程序集是/Workspace/export/misc/H.exe。这产生:

Unhandled Exception:
System.IO.IOException: Write fault on path /Workspace/export/misc/[Unknown]
  at System.IO.FileStream.WriteInternal (System.Byte[] src, Int32 offset, Int32 count) [0x00097] in /Workspace/mono/mcs/class/corlib/System.IO/FileStream.cs:658 
  at System.IO.FileStream.Write (System.Byte[] array, Int32 offset, Int32 count) [0x000aa] in /Workspace/mono/mcs/class/corlib/System.IO/FileStream.cs:634 
  at System.IO.StreamWriter.FlushBytes () [0x00043] in /Workspace/mono/mcs/class/corlib/System.IO/StreamWriter.cs:222 
  at System.IO.StreamWriter.FlushCore () [0x00012] in /Workspace/mono/mcs/class/corlib/System.IO/StreamWriter.cs:203 
  at System.IO.StreamWriter.Write (System.Char[] buffer) [0x00022] in /Workspace/mono/mcs/class/corlib/System.IO/StreamWriter.cs:351 
  at System.IO.TextWriter.WriteLine () [0x00000] in /Workspace/mono/mcs/class/corlib/System.IO/TextWriter.cs:257 
  at X.Main () [0x00066] in /Workspace/export/misc/H.cs:17 

您每次在process.StartInfo.WorkingDirectory 中使用无效目录时都会收到此信息。尽管错误信息应该更清楚,但对此无能为力。

由于引号,您的目录无效。您也不应该像以前那样连接路径名,因为这会使您的应用程序无法移植到非 Unix 操作系统。而是写成:

var home = Environment.GetFolderPath (Environment.SpecialFolder.UserProfile);
process.StartInfo.WorkingDirectory = Path.Combine (home, "pacotes", nome_pacote.Text+"-1.0");

使用Environment.GetFolderPath() 可以更轻松地在Mac 上运行您的应用程序(主目录位于/Users/<username> 而不是/home/<username>)。

【讨论】:

    【解决方案2】:

    另一种可能性是您启动的二进制文件是一个悬空符号链接。检查二进制文件是否存在或者是指向有效二进制文件的符号链接。

    【讨论】:

      【解决方案3】:

      正如另一条回复所述,“对此错误的一个可能解释是进程在您尝试写入之前已退出。”

      这就是我遇到的问题——即使在按照另一个答案中的描述设置了 WorkingDirectory 之后。在你同样的情况下:C#、Mono、Ubuntu。

      在我的情况下,最终的解决方案是设置参数,以便进程不退出,并且真的试图从 StandardInput 读取输入。

      【讨论】:

        【解决方案4】:

        你要写的路径也不能写。 " /home/vinholi/Ubuntu One/Uso do linux em flash drive/Programa gerador de .deb/GeradorDeb/GeradorDeb/bin/Debug/"

        看起来像一个 USB 驱动器。检查以下内容:

        1. 它不是只读的。
        2. 它不是以只读方式挂载的。
        3. USB 驱动器没有空间不足。

        【讨论】:

        • 这并没有真正回答他的问题。
        猜你喜欢
        • 1970-01-01
        • 2018-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多