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

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

问题描述:

我在Haskell编写了一个小程序,它通过MIDI控制命令arecordmidiaplaymidi来在我的数码钢琴上录制短暂的即兴创作。我将按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过程中节省出色的数据,并关闭所有的管道和文件。

看起来像发送SIGINTSystem.ProcessinterruptProcessGroupOf的方式。

+0

我也在想这个......最终决定暂时使用'terminateProcess',因为我的小程序仍然只是一个草稿。 – CamilB