2016-12-28 71 views
2

我在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 

回答

3

terminateProcess發送SIGTERM(終止)信號給過程,其對應於unix命令kill,這是一般的默認行爲不是你想要什麼時候想要很好地結束一個過程。

Ctrl+C發送信號SIGINT(中斷),其中許多應用程序處理通過一個有序的關閉,並在你的情況可能導致arecordmidi過程中節省出色的數據,並關閉所有的管道和文件。

看起來像發送SIGINTSystem.ProcessinterruptProcessGroupOf的方式。

+0

我也在想這個......最終決定暫時使用'terminateProcess',因爲我的小程序仍然只是一個草稿。 – CamilB