我在Haskell中编写了一个小程序,该程序可以操纵arecordmidiaplaymidi命令通过MIDI在我的数码钢琴上录制即兴演奏。我将按R键,程序将使用命令arecordmidi创建一个新的子进程。当我再次按R键时,我希望通过终止命令arecordmidi来停止录制。

如何终止arecordmidi子进程?如果在外壳中,则CTRL + C将停止记录。这就是我要的。

我正在使用以下代码创建子流程:

import System.Process

main = do
  let rec_command = "arecordmidi -p \"CASIO USB-MIDI\" myRecording.midi"
  process <- createProcess (shell rec_command)

  -- I could try the following code, but the documentation of System.Process
  -- says it's bad to use terminateProcess:
  let (_, _, _, processHandle) = process
  terminateProcess processHandle

最佳答案

terminateProcess向该进程发送一个SIGTERM(终止)信号,该信号与unix命令kill的默认行为相对应,这通常不是您试图很好地结束进程时想要的。

Ctrl+C发送信号SIGINT(中断),许多应用程序通过有序关闭来处理该信号,并且在您的情况下,可能会导致arecordmidi进程保存未完成的数据,并关闭所有管道和文件。

看起来与SIGINT发送System.Process的方式是与interruptProcessGroupOf一起发送的。

09-29 21:48