如何在 Haskell 中终止(SIGINT)子进程?

Cam*_*ilB 5 unix haskell process

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

如何终止子arecordmidi进程?如果在 shell 中,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
Run Code Online (Sandbox Code Playgroud)

E4z*_*4z9 5

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

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

看起来发送的方式是SIGINTwith 。System.ProcessinterruptProcessGroupOf