`Extended I/O specifiers` — I/O 단위를 여는 추가 사양(스펙티파이어)

Extended I/O specifiers — I/O 단위를 여는 추가 사양(스펙티파이어)

예전 코드에서 쓰던 I/O 스펙티파이어(specifier)인 CARRIAGECONTROL, READONLY, SHARE가 필요할 때가 있어요. 이들은 표준 Fortran이 아니라 GNU Fortran의 확장으로, -fdec 컴파일 플래그로 호환성을 위해 지원되는 기능이에요.

출처: The GNU Fortran Compiler — Extended I/O specifiers

본문

GNU Fortran은 호환성을 위해 추가적인 레거시 I/O 스펙티파이어 CARRIAGECONTROL, READONLY, SHARE-fdec 컴파일 플래그와 함께 지원해요.

CARRIAGECONTROL

CARRIAGECONTROL 스펙티파이어는 I/O 단위의 출력 레코드 사이 줄 종료(line termination) 설정을 제어할 수 있게 해줘요. 읽기 전용(readonly) 파일에는 의미가 없어요. 형식화 쓰기용으로 단위를 열 때 CARRIAGECONTROL을 지정하면, 그 설정값에 따라 출력 레코드 사이에 어떤 문자를 쓸지가 결정돼요. 문법은:

OPEN(..., CARRIAGECONTROL=cc)

여기서 cc는 다음 값 중 하나로 평가되는 문자 표현식이에요.

의미
'LIST' 레코드 사이에 줄바꿈 하나 (기본값)
'FORTRAN' 첫 문자의 레거시 해석 (아래 참고)
'NONE' 레코드 사이에 구분자 없음

CARRIAGECONTROL='FORTRAN'을 쓰면, 레코드를 쓸 때 입력 레코드의 첫 문자는 쓰지 않고, 대신 그 문자로 출력 레코드 구분자를 결정해요.

선두 문자 의미 출력 구분 문자
'+' 겹쳐 쓰기(Overprinting) 캐리지 리턴만
'-' 새 줄(New line) 줄바꿈 + 캐리지 리턴
'0' 줄 건너뛰기(Skip line) 줄바꿈 2개 + 캐리지 리턴
'1' 새 페이지(New page) 폼 피드 + 캐리지 리턴
'$' 프롬프트(Prompting) 줄바꿈 (캐리지 리턴 없음)
CHAR(0) 겹쳐 쓰기 (전진 없음) 없음

READONLY

READONLY 스펙티파이어는 단위를 열 때 지정할 수 있어요. ACTION='READ'를 지정한 것과 동등하며, 한 가지 차이는 닫을 때 파일을 삭제할 수 없다는 점이에요 (즉 STATUS="DELETE"CLOSE할 수 없어요). 문법은:

OPEN(..., READONLY)

SHARE

SHARE 스펙티파이어는 여러 프로세스/스레드의 제어된 접근을 위해, 단위를 열 때 시스템 수준의 잠금(locking) 을 허용해요. SHARE 스펙티파이어에는 여러 형태가 있어요:

OPEN(..., SHARE=sh)
OPEN(..., SHARED)
OPEN(..., NOSHARED)

첫째 형태의 sh는 아래 표의 값으로 평가되는 문자 표현식이에요. 뒤의 두 형태는 특정 sh 값의 별칭(alias)이에요.

명시적 형태 짧은 형태 의미
SHARE='DENYRW' NOSHARED 배타적(쓰기) 잠금
SHARE='DENYNONE' SHARED 공유(읽기) 잠금

일반적으로 한 파일에 대해 배타적(쓰기) 잠금을 가질 수 있는 프로세스는 하나뿐이고, 같은 파일에 대해 공유(읽기) 잠금을 가질 수 있는 프로세스는 여러 개예요.

잠금 동작은 운영 체제에 따라 달라요. POSIX 시스템에서는 잠금이 fcntl로 구현돼요. 자세한 내용은 해당 운영 체제의 매뉴얼 페이지를 참고하세요. SHARE=를 통한 잠금은 다른 시스템에서는 지원되지 않아요.

더 알아보기

  • -fdec — GNU Fortran의 DEC 확장 호환 플래그
  • I/O 단위 열기(OPEN) 문법