【问题标题】:How to terminate (SIGINT) a subprocess in Haskell?如何终止(SIGINT)Haskell 中的子进程?
【发布时间】:2016-12-28 18:26:05
【问题描述】:

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

【问题讨论】:

    标签: unix haskell process


    【解决方案1】:

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

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

    看起来使用System.Process 发送SIGINT 的方式是使用interruptProcessGroupOf

    【讨论】:

    • 我也在考虑这个...最终决定暂时使用terminateProcess,因为我的小程序还只是一个草稿。
    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2015-12-05
    • 1970-01-01
    相关资源
    最近更新 更多