`EXECUTE_COMMAND_LINE` — 셸 명령 실행

EXECUTE_COMMAND_LINE — 셸 명령 실행

프로그램 안에서 셸 명령을 그대로 실행하고, 그 결과 상태까지 받아오고 싶을 때가 있어요. 그럴 때 쓰는 내장 프로시저가 EXECUTE_COMMAND_LINE이에요.

출처: The GNU Fortran Compiler — EXECUTE_COMMAND_LINE (Execute a shell command)

본문

시그니처

CALL EXECUTE_COMMAND_LINE(COMMAND [, WAIT, EXITSTAT, CMDSTAT, CMDMSG ])

설명

EXECUTE_COMMAND_LINE은 셸 명령을 동기 또는 비동기로 실행해요. COMMAND 인자가 셸에 전달되어 실행되는데, 유닉스 계열에서는 sh, Windows에서는 cmd.exe가 이 셸이에요.

WAIT가 주어지고 값이 false면 시스템이 지원할 경우 명령이 비동기로 실행돼요. 그렇지 않으면 C 라이브러리의 system 호출로 동기 실행돼요.

마지막 세 인자는 상태 정보를 받아오는 데 써요. 동기 실행이 끝나면 EXITSTATsystem이 돌려준 정수 종료 코드가 들어가요. CMDSTAT는 명령 줄이 (종료 상태와 무관하게) 실행됐으면 0으로 설정되고, 오류가 발생했으면 CMDMSG에 오류 메시지가 할당돼요.

참고로 system 함수는 스레드에 안전할 필요가 없어요. system이 동시에 호출되지 않도록 하는 건 사용자의 책임이에요. 지원 대상에서 비동기 실행할 때는 POSIX의 posix_spawn이나 fork 함수를 사용하며, SIGCHLD 신호에 대한 핸들러도 설치돼요.

클래스

Subroutine (서브루틴)

인자

인자 설명
COMMAND 기본 CHARACTER 스칼라여야 해요.
WAIT (선택) 기본 LOGICAL 스칼라.
EXITSTAT (선택) 기본 kind의 INTEGER.
CMDSTAT (선택) 기본 kind의 INTEGER.
CMDMSG (선택) 기본 kind의 CHARACTER 스칼라.

예제

program test_exec
  integer :: i

  call execute_command_line ("external_prog.exe", exitstat=i)
  print *, "Exit status of external_prog.exe was ", i

  call execute_command_line ("reindex_files.exe", wait=.false.)
  print *, "Now reindexing files in the background"

end program test_exec

주의사항

이 내장 함수는 system 함수 호출을 기반으로 구현되므로, 신호 처리에 관한 동작은 프로세서에 따라 달라요. 특히 POSIX 규격 시스템에서는 SIGINTSIGQUIT 신호가 무시되고 SIGCHLD가 블록돼요. 그래서 부모 프로세스가 종료돼도 자식 프로세스가 같이 종료되지 않을 수 있어요.

표준

Fortran 2008 이후.

더 알아보기

  • SYSTEM — 셸 명령 실행