POSIX 기반 프로그램을 사용하여 VOS 구조화 파일을 처리하려고 시도한 적이 있는 경우 일부 제한 사항이 발생했거나 이해하지 못하는 동작이 보였을 수 있습니다. 이 게시물에서 나는 무슨 일이 일어나고 있는지 설명하려고합니다.
VOS는 순차적, 상대적, 고정 및 스트림의 4가지 유형의 파일을 지원합니다. 파일 시스템이 레코드 경계를 추적하기 때문에 처음 3 가지 형식은 "구조화된" 파일이라고 합니다. 사용 가능한 I/O 작업은 전체 레코드를 읽고 작성합니다. 레코드 경계가 암시적이기 때문에 마지막 형식을 "비정형"이라고 합니다. 새 줄 문자는 레코드를 구분합니다. 사용 가능한 I/O 작업은 바이트 시퀀스를 읽고 작성합니다.
유닉스® 또는 Linux© 시스템에서 발견되는 것과 같은 POSIX 준수 환경에는 "일반 파일"이라고 부르는 네이티브 파일 유형이 하나만 있습니다. VOS 스트림 파일 조직은 POSIX 일반 파일과 동일합니다.
VOS POSIX 런타임 환경은 4가지 유형의 파일을 POSIX 일반 파일로 분류합니다. 따라서 적어도 이론적으로 POSIX 프로그램은 4 개의 파일 유형 중 일부를 읽거나 쓸 수 있습니다. 그러나 그렇게 간단하지는 않습니다.
POSIX API는 바이트 시퀀스 측면에서 모든 I/O 작업을 정의하고 VOS는 레코드 시퀀스 측면에서 I/O 작업(구조화된 파일)을 정의하기 때문에 VOS POSIX 런타임은 사용자 공간의 현재 레코드를 버퍼링하고 버퍼에서 POSIX I/O 작업을 수행한 다음 버퍼에 대한 버퍼 레코드를 다시 작성하여 차이를 중재합니다.
POSIX 프로그램이 각 레코드의 크기(예: 고정 파일)를 알고 있고 정확한 바이트 수를 읽고 쓰는 경우 버퍼의 존재가 작업에 영향을 주지 않으며 두 가지 유형의 I/O 작업의 매핑을 이해하기 쉽고 효율적으로 이해할 수 있습니다.
그러나 POSIX 프로그램이 기본 레코드 크기에 관계없이 바이트 스트림을 읽거나 쓰는 경우 POSIX 의미 체계에 대한 매핑은 일반적으로 매우 유용하지 않으며 종종 매우 비효율적입니다. 바이트 위치를 찾거나 레코드 경계를 가로질러 확장되는 바이트 시퀀스를 다시 작성하는 것과 같은 특정 작업은 최악의 경우 비효율적이고 불가능합니다.
그런 다음 새로운 문자의 처리의 문제가있다.
POSIX 일반 파일과 VOS 스트림 파일은 모두 새선 문자를 사용하여 레코드 경계를 구별합니다. 그러나 구조화 된 파일의 VOS 레코드에는 일반적으로 새로운 문자가 포함되지 않습니다. 예를 들어 VOS 편집기(예: 편집, 에맥 또는 line_edit)가 새 순차 파일을 만들 때 각 레코드에는 한 줄의 텍스트가 포함되어 있습니다. 그러나 레코드는 새로운 문자로 끝나지 않습니다. 규칙에 따라 프로그램은 모두 텍스트가 포함된 순차적 파일에 각 레코드의 끝에 암시적 새줄이 있다고 가정합니다. 상대적 및 고정 파일에 대해도 마찬가지입니다. 그러나 여기에 중요한 점은 파일 (VOS, 유닉스, 구조화 또는 구조화되지 않은)의 속성이 파일에 텍스트 또는 이진 데이터가 포함되어 있는지 여부를 기록하지 않습니다. 차이점은 파일에 액세스하는 프로그램에 남아 있습니다.
이 상황은 VOS POSIX 런타임에 대한 당황의 무언가를 만듭니다. VOS 구조화 파일에 각 레코드에 새 줄을 더할지 여부를 알기 위해 텍스트 또는 데이터가 포함되어 있는지 여부를 알아야 합니다. 파일에 텍스트가 포함된 경우 새 줄에 새 줄이 부가되어야 합니다. 데이터가 포함된 경우 새 줄에 새 줄이 부가되어서는 안 됩니다.
대답은 VOS POSIX 런타임이 이 정보를 제공하기 위해 호출자에게 달려 있다는 것입니다. 기본적으로 POSIX 런타임은 구조화된 파일을 텍스트를 포함하는 것처럼 처리하고 새 줄을 더합니다. 호출자는 O_TEXT 개구부 모드를 제공하여 이 동작을 명시적으로 요청할 수 있습니다. VOS 구조화 파일을 데이터를 포함하는 것으로 처리하려는 호출자는 O_BINARY 개구부 모드를 제공해야 합니다. 이 두 가지 모드는 상호 배타적입니다. 그 중 하나를 지정하는 경우 다른 하나를 지정해서는 안 됩니다. 이러한 모드는 스트림 파일에 필요하지 않으므로 이 경우 무시됩니다.
이 게시물을 읽고 있는 언어 변호사의 경우 O_TEXT O_BINARY POSIX 표준의 연장선이라는 점에 유의하십시오. POSIX 자체에 의해 정의되지 않습니다. 일반적으로 텍스트와 이진 파일(VOS와 마찬가지로)을 구별하거나 Windows와 마찬가지로 CR-LF를 사용하는 특별한 종선 규칙만 있는 운영 체제에만 존재합니다.
정책에 따라 Stratus가 POSIX 기반 소프트웨어를 OpenVOS에 포트할 때 고정 및 상대 파일의 사용을 제외하도록 수정하고 순차 파일을 읽기 전용 액세스로 제한합니다. 또한 모든 순차 파일에 텍스트가 포함되어 있다고 가정합니다. 이러한 규칙은 순차 적 출력 파일에 바이트 지향 작업을 수행하려는 고유한 비효율성을 피하면서 스트림 또는 순차 파일을 POSIX 프로그램에 대한 입력으로 사용하는 것이 실용적입니다.
요약하자면 POSIX 기반 프로그램을 사용하여 STREAM 파일(입력 또는 출력)과 순차 파일(텍스트 입력만)만 사용하는 것이 가장 좋습니다. 구조화 된 파일에 이진 데이터가있는 경우 작은 프로그램을 작성하여 스트림 파일로 복사 한 다음 POSIX 프로그램과 함께 파일의 스트림 버전을 사용합니다. POSIX 프로그램으로 처리하려는 고정 또는 상대 파일에 텍스트 데이터가 있는 경우 먼저 파일을 STREAM 파일로 복사합니다.