【问题标题】:Process requires to press <enter> to continue. Is it possible to do using Mono GTK#?进程需要按 <enter> 才能继续。可以使用 Mono GTK# 吗?
【发布时间】:2012-07-29 05:33:48
【问题描述】:

我正在尝试在 Mono 中使用 GTK# 运行“dh_make”shell 命令。问题是: dh_make 要求进程开始工作,按 键。我不知道是否可以使用 C#。你能帮助我吗?

【问题讨论】:

  • C#和dh_make有什么关系?您应该详细说明您想要实现的目标,以及到目前为止您编写了什么代码。
  • 也许您可以在您的 GTK# 程序和 dh_make 之间连接 pipe(2),使用 g_spawn_async_with_pipes 的 GTK# 包装,然后在管道上发送 \n
  • 我试图在 MonoDevelop 中使用 GTK# 创建一个应用程序,该应用程序使用非二进制文件构建 .deb 包,用于学术目的。运行 dh_make 是生成 .deb 包的一个步骤。我正在使用 Process 类来运行这个命令,但是我遇到了一个问题:在初始化 dh_make 之后,为了让进程开始处理打包,我必须在终端上按 键,我不知道是不是可以使用 C#。
  • 那么我对g_spawn_async_with_pipes 的评论与您有关。您至少需要两个管道(一个用于输入,一个用于输出)与您的dh_make 进程通信。
  • 谢谢,但是你能给我一些关于如何使用 C# 的教程链接吗?我在 Google 中找不到它。

标签: c# linux shell process gtk#


【解决方案1】:

是的,绝对有可能模拟“输入”对进程的按下作为来自用户的输入。下面的代码可以做到这一点,将 dh_make 作为一个单独的进程启动,将其标准输入定向到创建进程的输出,并将“enter”作为输入发送到 dh_make 进程:

System.Diagnostics.Process myProcess = new System.Diagnostics.Process();
myProcess.StartInfo.FileName = "dh_make";
myProcess.StartInfo.Arguments = "(put here any command line arguments you need)";
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.RedirectStandardInput = true;
myProcess.Start();
System.IO.StreamWriter myStreamWriter = myProcess.StandardInput;

// The following will put an 'Enter' on the first dh_make request for user input
myStreamWriter.WriteLine(" "); 

我目前在几段代码中使用它,效果很好。

希望有帮助!

【讨论】:

【解决方案2】:

正如我所评论的,您需要让管道使用g_spawn_async_with_pipesdh_make 进程通信。使用 Gtk,您可能需要掌握 main event loop 并使用 g_child_watch_add 添加儿童观看和使用 g_io_add_watch 观看频道。您可能必须使用两个通道(即管道),一个用于dh_make 的输入,另一个用于其输出。

如果您不知道pipes 是什么,请考虑阅读一本好的advanced linux programmingadvanced unix programming 书籍。 Gtk 的主循环正在为你做多路复用poll

如果您想了解这些低级 Gtk/Glib 函数是如何与 Gtk# 粘合的,请研究 Gtk# 文档并最终查看其源代码(可能在 Gtk# 的源代码上使用 grep) . Gtk# 可能有一些与此相关的测试或演示或示例代码。

【讨论】:

    【解决方案3】:
            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();
            System.IO.StreamWriter myStreamWriter = process.StandardInput;
            myStreamWriter.WriteLine(" ");
            process.WaitForExit();
    

    调试时出现以下错误:奇数字符“>”,在元素“文件名”的属性名称“未知”之后需要一个“=”。你知道可能是什么吗?

    【讨论】:

    • 当我跳转到 "myStreamWriter.WriteLine(" ");" 行时出现此错误。
    猜你喜欢
    • 1970-01-01
    • 2010-10-28
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 2015-04-27
    相关资源
    最近更新 更多