2016-12-28 2 views
2

Ich schreibe ein kleines Programm in Haskell, das die Befehle arecordmidi und aplaymidi manipuliert, um kurze Improvisationen auf meinem Digitalpiano über MIDI aufzunehmen. Ich werde den Schlüssel R drücken, mein Programm wird einen neuen Unterprozess mit dem Befehl arecordmidi erstellen. Wenn ich erneut R drücke, möchte ich, dass meine Aufnahme beendet wird, indem ich den Befehl arecordmidi beende.Wie man einen Subprozess in Haskell (SIGINT) beendet?

Wie kann ich den arecordmidi Subprozess beenden? Wenn in einer Shell CTRL + C die Aufzeichnung stoppen würde. Das ist was ich will.

Ich verwende den folgenden Code der Subprozess zu erstellen:

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 

Antwort

3

terminateProcess sendet ein SIGTERM (beenden) Signal an den Prozess, der kill, auf das Standardverhalten des UNIX-Befehl entspricht, der im Allgemeinen nicht was du willst, wenn du versuchst einen Prozess schön zu beenden.

Ctrl+C sendet das Signal SIGINT (Interrupt), die viele Anwendungen, die von einer geordneten Abschaltung behandeln, und in Ihrem Fall führt wahrscheinlich im arecordmidi Prozess hervorragende Daten zu speichern, und schließt alle Rohre und Dateien.

Sieht aus wie der Weg zu senden mit System.Process ist mit interruptProcessGroupOf.

+0

Ich dachte darüber nach ... Schließlich entschied ich mich für 'terminateProcess' zu verwenden, da mein kleines Programm immer noch nur ein Entwurf ist. – CamilB

Verwandte Themen