2012-03-15 2 views
7

외부 명령을 순서대로 실행해야하는 상황에 있다면 가장 좋은 해결책은 무엇입니까?Haskell : 엄격한 순서로 외부 명령을 실행하십시오

예를 들어, "make snapshot"및 "backup snapshot"명령이 있습니다. 첫 번째 스냅 샷이 완료 될 때까지 두 번째 스냅 샷을 시작할 수 없습니다. do 명령으로 두 명령을 순서대로 지정하면 명령이 차례로 실행됩니까? 아니면 수동으로 확인하고 첫 번째 명령이 완료되었는지 확인해야합니까? 수동 완료 확인을 위해

은 충분히 "시스템"또는 rawSystem을 사용하는 것입니다 "자신의 종료 코드를 검사?

나는 완전히 사이의 차이를 이해하지 못한다"시스템 "과"runCommand "기능을. 수 누군가 나에게이 사실을 분명히 해줄 뿐인데, 다른 값을 반환 할 수밖에 없다 : 종료 코드와 프로세스 핸들. 다른 차이점은 무엇입니까?

위의 순서가 작동하려면 오히려 "runCommand"를 사용해야합니까? 프로세스 핸들을 기다리시겠습니까?

감사합니다.

답변

11

System.Process 모듈을 사용하여 외부 명령을 실행하고있는 것으로 알고 있습니다. 이것은 좋다.

이 모듈에는 차단 및 비 차단 IO 작업이 모두 포함되어 있습니다. 비 블로킹 (예 : createProcess, runCommand) 프로세스가 생성되고 핸들이 즉시 실행되는 동안 핸들이 즉시 반환됩니다. 차단하는 것 (예 : readProcess, system)은 핸들을 반환하지 않고 프로세스가 종료되면 프로세스를 실행 한 결과를 반환합니다.

프로세스가 종료되었는지 확인하려면 차단 작업을 사용하거나 waitForProcess을 사용해야합니다.이 작업은 지정된 핸들이있는 프로세스가 종료 될 때까지 차단됩니다.

은 충분히 "시스템"또는 rawSystem을 사용하는 것입니다 "자신의 종료 코드를 검사?

예.

의 차이"시스템 "과"runCommand "기능

가장 큰 차이점은 system입니다. runCommand은 차단되어 있습니다.

위의 시퀀스가 ​​작동하려면 "runCommand"를 사용해야 할 필요가 있습니까?

아니요, 차단 통화로 충분할 것입니다.

프로세스 핸들에서 wait를 호출해야합니까?

비 차단 호출을 사용하려는 경우에만. 사용의

예 : 나를 위해 그것을 명확히하기위한

import System.Process 
main = do 
    ExitSuccess <- system "make snapshot" 
    ExitSuccess <- system "backup snapshot" 
    return() 
+0

감사합니다.말이된다. –

+0

예를 들어, 두 번째 프로그램을 실행하기 전에 첫 번째 프로그램이 성공적으로 종료되었는지 어떻게 확인합니까? –

+4

@ r.sendecky :'ExitSuccess <- system "make snapshot"은'System' 호출 결과에 대해 패턴 매칭을합니다 - 그것이'ExitSuccess'를 리턴하는지 확인하십시오. 패턴 일치가 실패하면 [IO의'fail'이 호출됩니다] (http://en.wikibooks.org/wiki/Haskell/do_Notation#Translating_the_bind_operator). – rampion

관련 문제