如何在Haskell中终止(SIGINT)子进程?
问题描述:
我在Haskell编写了一个小程序,它通过MIDI控制命令arecordmidi
和aplaymidi
来在我的数码钢琴上录制短暂的即兴创作。我将按R键,我的程序将使用命令arecordmidi
创建一个新的子过程。当我再次按R时,我想通过终止命令arecordmidi
来停止录制。如何在Haskell中终止(SIGINT)子进程?
如何终止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
答
terminateProcess
发送SIGTERM
(终止)信号给过程,其对应于unix命令kill
,这是一般的默认行为不是你想要什么时候想要很好地结束一个过程。
Ctrl+C
发送信号SIGINT
(中断),其中许多应用程序处理通过一个有序的关闭,并在你的情况可能导致arecordmidi
过程中节省出色的数据,并关闭所有的管道和文件。
看起来像发送SIGINT
与System.Process
是interruptProcessGroupOf
的方式。
我也在想这个......最终决定暂时使用'terminateProcess',因为我的小程序仍然只是一个草稿。 – CamilB