如何防止一个子进程饿死其他子进程?


10

明确地说,我不是在谈论任何需要emacs多线程的东西(尽管这也可能会解决这个问题)。复制:

  1. emacs -Q#我正在运行24.4.1
  2. 制作第二帧
  3. 切换回第一帧
  4. MX壳
  5. MX唯一重命名(稍后我们将制作第二个Shell)
  6. 开始运行: while true; do echo "hello world"; done
  7. 在第二帧中,Mx shell

第二个shell 几乎不会显示(很少会反复尝试才能工作)。显然,emacs从读取第一个shell的输出到侦听来自任何其他进程的输出不会中断。当有多个进程具有待处理的输出时,对它进行循环将是更好的行为。有什么办法可以取得更好的行为?

我知道的唯一技巧是使shell缓冲自己的进程,但是不幸的是,这对我不起作用。即使这样做,我也必须运行一个子进程来侦听套接字,以使我的语音识别软件正常工作,以便我实际上可以首先控制外壳,这就是我发现这一点的方式;像上面那样运行无限循环,可以防止从套接字中取出任何数据。


1
对于您的问题,我没有具体答案。但是,我喜欢start-process与a set-process-filter和a 一起使用set-process-sentinel-这使我可以在进程运行时继续做其他事情-有时甚至使用来将我的输出发送到*Messages*缓冲区,以insert使我的回声区域保持不变,或者我使用专用的过程输出缓冲区(如果需要)。例如,我可以进行长时间的rsync会话。我没有尝试同时运行多个命令或冗长的代码的经验start-process,所以我不确定Emacs如何处理其中的所有操作。
法律列表

2
嗯,有趣的发现。两个外壳程序的下级进程都是独立的进程,显然Emacs仍在处理其主命令循环而没有问题。但是,我怀疑当它轮询劣质FD时,总是在第一个外壳上找到东西,而从未处理第二个FD。如果您在第一个shell中杀死了while [1],第二个shell确实会如您所愿地出现。对于开发人员邮件列表,这可能是一个问题。
stsquad

我还有另一个问题,但这是带有框架的图片:lists.gnu.org/archive/html/bug-gnu-emacs/2015-10/msg01084.html
ReneFroger 2015年

Answers:


2

因此,这不是一个适当的解决方案,但是我以另一种方式(例如,第二个shell上的while [1])对您进行了测试,并且工作正常。作为一种变通方法,您可以确保可能会产生大量输出的所有Shell缓冲区都比想要交互性的Shell缓冲区创建得晚。这样,交互式外壳程序将首先由Emacs的劣质民意测验处理,然后再最终处理生成大量输出的内容。

实际上,如果您运行的是交互式外壳程序,则可能不会长时间占用I / O。如果您经常需要这样的东西,也许将输出重定向到文件中并使用视图模式是更好的解决方案?


1
这里的问题是,偶然编写一个无限循环并不难。我也希望不必考虑运行命令时要执行多少I / OI。使用emacs的全部好处是,一切都已经在一个不错的可保存缓冲区中了:)
Joseph Garvin

1
@JosephGarvin我很感激。我认为最好的解决方案是使用出色的复制器解决Mx报告错误。
stsquad
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.