CICS 환경에서의 프로그램 호출
- localCall
- 동일한 CICS 리젼 내에서 수행되는 호출입니다.
- remoteCall
- 한 CICS 리젼에서 다른 리젼으로, 또는 생성된 Java™ 프로그램에서 생성된 COBOL 프로그램(CICS에서 실행)으로 수행되는 호출입니다.
- DYNAMIC
- 표준 동적 COBOL 호출입니다.
- STATIC
- 표준 정적 COBOL 호출입니다. 호출 대상 프로그램은 호출 프로그램을 사용하여 링크 편집되어야 합니다.
- CICSLINK
- CICS LINK 명령(CICS 프로그램에 대한 기본값)입니다. CICSLINK는 다음 상황에서만 지원됩니다.
- 호출 대상 프로그램의 callLink 요소가 remoteCall을 지정합니다.
- 호출 대상 프로그램의 callLink 요소가 parmForm = CHANNEL을 지정합니다.
- call 문이 isExternal = YES를 지정하거나 호출 대상 프로그램의 callLink 요소가 pgmType = EXTERNALLYDEFINED를 지정합니다.
- 다른 모든 경우(CICSLINK가 기본값인 경우 포함) EGL은 linkType = CICSLINK에 대해 CICS LINK 명령을 생성하지 않습니다. 그 대신 EGL은 호출 대상 프로그램의 callLink 요소에 linkType = DYNAMIC을 지정한 경우와 같은 호출인 표준 동적 COBOL 호출을 생성합니다.
- linkType 특성이 DYNAMIC 또는 CICSLINK로 설정된 localCall. 또는, localCall의 경우 프로그램에 대해 CICS 자동 설치 기능을 사용할 수 있습니다.
- remoteCall
- COMMPTR
- 매개변수에 대한 포인터가 COMMAREA에 전달됩니다(특성 type이 localCall인 경우 CICS 프로그램에 대한 기본값).
- COMMDATA
- 매개변수 데이터가 COMMAREA에 전달됩니다(특성 type이 remoteCall인 경우 CICS 프로그램에 대한 기본값).
- OSLINK
- 매개변수가 표준 COBOL 매개변수 목록을 사용하여 전달됩니다. 호출 대상 프로그램은 CICS 명령문을 포함하거나 EGL 프로그램이 될 수 없습니다.
- CICSOSLINK
- 표준 COBOL 매개변수 목록이 사용됩니다. 처음 두 개의 매개변수는 EIB(EXEC 인터페이스 블록) 및 COMMAREA이고 그 뒤에는 call 문 매개변수가 있습니다.
- CHANNEL
- 매개변수가 채널에 있는 컨테이너를 통해 전달됩니다. 이러한 컨테이너의 이름은 EGL-PARM-1부터 시작하여 EGL-PARM-n까지 지정되며 n의 최대값은 30입니다. CHANNEL 매개변수 형식에서는 COMMAREA가 전달되지 않습니다.
| COMMPTR | COMMDATA | OSLINK | CICSOSLINK | CHANNEL | |
|---|---|---|---|---|---|
| DYNAMIC | 유효 | 유효 | 유효 | 유효 | 아니오 |
| STATIC | 유효 | 유효 | 유효 | 유효 | 아니오 |
| CICSLINK | 유효 | 유효 | 아니오 | 아니오 | 유효 |
| REMOTE | EGL로 생성된 Java 프로그램에서 호출하는 경우 유효합니다. CICS 프로그램에서 호출하는 경우에는 유효하지 않습니다. | 유효 | 아니오 | 아니오 | 유효 |
자세한 정보는 "연계 옵션 파트"를 참조하십시오.
- 두 프로그램이 모두 CICS에서 실행되는 경우에는 type 특성을 remoteCall로 설정하고 linkType 특성을 COMMDATA로 설정하십시오. call 문이 COMMAREA 제어 블록(COMMDATA)에 전달된 데이터를 사용하여 CICS LINK 명령으로 생성됩니다.
- 호출 프로그램이 생성된 Java 프로그램이며 호출 대상 프로그램이 CICS에서 실행되는 경우에는 type 특성을 remoteCall로 설정하고, 호출 대상 프로그램이 매개변수를 수신하는 방식에 따라 linkType 특성을 COMMPTR 또는 COMMDATA로 설정하십시오.
호출 프로그램 또는 호출 대상 프로그램이 PL/I 프로그램인 경우에는 linkType 특성을 CICSLINK로 설정해야 합니다. 또한 호출 대상 프로그램이 PL/I 프로그램인 경우에는 call 문에 isExternal = YES를 지정하거나 호출 대상 프로그램의 callLink 요소에 pgmType = EXTERNALLYDEFINED를 지정해야 합니다. 호출 프로그램이 PL/I 프로그램인 경우에는 호출 대상 EGL 프로그램의 callLink 요소에 linkType = CICSLINK를 지정해야 합니다.
다음 절에서는 call 문에 매개변수를 사용하는 데 대한 구체적인 정보를 제공합니다.
CICS의 call 문 매개변수의 형식
다음 절에서는 CICS 환경의 call 문에 사용되는 매개변수 형식에 대한 자세한 설명을 제공합니다.
COMMAREA 포인터(COMMPTR) 매개변수 형식
COMMPTR 매개변수 형식의 경우 포인터는 CICS COMMAREA를 통해 전달됩니다. COMMAREA는 호출 프로그램의 COBOL 작업 스토리지 영역에서 생성됩니다. 매개변수 형식 COMMPTR의 COMMAREA에 있는 마지막 매개변수 주소에 대해 최상위 비트가 설정됩니다.
아래 그림은 COMMPTR 매개변수 형식을 보여줍니다. 레지스터 1은 포인터 목록을 가리킵니다. 첫 번째 포인터는 EIB(EXEC 인터페이스 블록)의 주소이며 그 뒤에는 COMMAREA의 주소가 있습니다. 매개변수에 대한 포인터는 COMMAREA를 통해 전달됩니다.

호출 프로그램에 대해 endCommarea 빌드 디스크립터 옵션을 YES로 설정하면 호출 프로그램은 매개변수 목록의 끝에 x'FFFFFFFF' 전자를 추가합니다. 호출 대상 프로그램이 CSP/AE 프로그램으로부터 이전에 호출된 프로그램과 마찬가지로 이 마지막 전자를 필요로 하는 경우에만 endCommarea를 YES로 설정해야 합니다. COMMAREA의 길이는 endCommarea가 YES로 설정되지 않은 한 이 전자를 위한 4바이트를 포함하지 않습니다. 특정 조건 하에서는 CICS가 호출 대상 프로그램에 COMMAREA의 사본을 전달하기도 합니다.
COMMAREA 데이터(COMMDATA) 매개변수 형식
COMMDATA 매개변수 형식의 경우 실제 데이터는 CICS COMMAREA에 있는 하나의 버퍼를 통해 전달됩니다. COMMAREA는 호출 프로그램의 작업 스토리지 영역에서 생성됩니다. 각 매개변수값은 COMMAREA로 이동되며, 여기서 값은 경계 맞추기에 관계없이 서로 인접합니다. 변수 길이 레코드가 전달되는 경우에는 EGL에 정의된 최대 길이 레코드만큼 공간이 예약됩니다. lengthItem 특성이 설정된 변수 길이 레코드가 전달되는 경우에는 레코드의 고정 부분 내에 필수 공간이 정의되어야 합니다. 호출 대상 프로그램은 COMMAREA의 매개변수값을 같은 순서대로 리턴해야 합니다. 호출 프로그램은 COMMAREA의 리턴된 매개변수값을 다시 원래 매개변수로 이동합니다.
아래 그림은 COMMDATA 매개변수 형식을 보여줍니다. 레지스터 1은 포인터 목록을 가리킵니다. 첫 번째 포인터는 EIB의 주소이며 그 뒤에는 COMMAREA의 주소가 있습니다. 실제 매개변수 데이터는 COMMAREA를 통해 전달됩니다.

OSLINK 매개변수 형식
- EXEC CICS 명령을 포함하지 않는 비EGL 프로그램
- ZOSBATCH 환경에 대해 생성된 EGL 프로그램. 이 경우 호출 대상 EGL 프로그램은 I/O를 수행해서는 안됩니다. 또한 호출 대상 EGL 프로그램의 callLink 항목에 linkType = DYNAMIC을 지정해야 합니다.
아래 그림은 OSLINK 매개변수 형식을 보여줍니다. 레지스터 1은 매개변수 데이터의 버퍼 주소인 포인터 목록(매개변수당 하나의 포인터)을 가리킵니다.

CICSOSLINK 매개변수 형식
CICSOSLINK 매개변수 형식의 경우 EIB 및 COMMAREA는 항상 처음 두 매개변수로 전달되며 그 뒤에는 call 문에 지정된 매개변수가 있습니다. CICSOSLINK는 STATIC 및 DYNAMIC 연계 유형에 대해서만 유효합니다.
아래 그림은 CICSOSLINK 매개변수 형식을 보여줍니다. 레지스터 1은 포인터 목록을 가리킵니다. 첫 번째 포인터는 EIB의 주소이며 그 뒤에는 COMMAREA의 주소가 있고, 그 뒤에는 매개변수 데이터의 버퍼 주소(매개변수당 하나의 포인터)가 있습니다.

CHANNEL 매개변수 형식
CHANNEL 매개변수 형식의 경우에는 채널을 통해 컨테이너가 전달됩니다. 채널은 CICS 프로그램 간에 데이터를 전달하는 데 매개변수와 같은 역할을 하는 컨테이너의 세트입니다. CHANNEL 매개변수 형식에서는 COMMAREA가 전달되지 않습니다.
EGL로 생성된 프로그램이 호출 대상 프로그램에 채널을 전달하면 이 채널은 해당 호출 대상 프로그램과 같은 이름을 갖습니다. 그러나 EGL 호출 대상 프로그램이 채널을 수신하는 경우 이 프로그램은 CICS API 호출을 사용하여 전달된 채널의 이름을 검색합니다.
이러한 컨테이너의 이름은 EGL-PARM-1부터 시작하여 EGL-PARM-n까지 지정되며 n의 최대값은 30입니다.
예를 들어, 유형이 각각 INT, 레코드(33,000바이트) 및 EGL STRING인 세 개의 매개변수를 전달하는 경우 채널은 다음 표에 표시된 바와 같이 세 개의 컨테이너를 포함합니다.
| 컨테이너 이름 | 컨테이너의 값 |
|---|---|
| EGL-PARM-1 | 4바이트의 INT |
| EGL-PARM-2 | 33,000바이트의 레코드 |
| EGL-PARM-3 | STRING에 대한 4바이트의 포인터(호출 대상 프로그램이 EGL이어야 함) |
EGL 프로그램의 EGL 프로그램에 대한 호출
호출 대상 프로그램이 실행되며 이 프로그램이 종료되거나 exit program 문이 실행되면 호출 프로그램으로 제어를 리턴합니다. call 문에서는 최대 30개의 매개변수를 전달할 수 있습니다. CICS SYNCPOINT는 call 문의 결과로 발생하지 않습니다. 호출 대상 프로그램의 type, linkType 및 parmForm 특성은 호출 프로그램 및 호출 대상 프로그램을 생성할 때 모두 동일해야 합니다. 연계 유형 또는 매개변수 형식이 변경되면 호출 대상 프로그램 및 이 프로그램을 호출하는 모든 프로그램을 다시 생성해야 합니다. 호출에 사용되는 매개변수 형식에 대한 설명은 위 "call 문 매개변수의 형식"을 참조하십시오.
z/OS® 일괄처리에 대해 호출 대상 프로그램을 생성할 수 있으며 이 프로그램을 CICS에서 사용할 수도 있습니다. CICS에서 이 호출이 작동하도록 하려면 IBM® Rational® COBOL Runtime Guide for zSeries의 11장에 있는 "CICS에서 z/OS 일괄처리 프로그램을 호출하는 데 필요한 CICS 설정" 장에 설명되어 있는 메인프레임 설정을 수행하십시오.
EGL 프로그램의 비EGL 프로그램에 대한 호출
- EGL call 문에서 isExternal 특성을 YES로 설정하십시오.
- 호출 대상 프로그램의 callLink 항목에 pgmType = EXTERNALLYDEFINED를 지정하십시오.
사용자 프로그램 이름이 CICS에 정의되어 있어야 하며 프로그램이 운영 체제 로드 라이브러리에 있어야 합니다. 그렇지 않으면 NOT FOUND 상태가 발생합니다. 또한 프로그램은 CICS 명령 레벨 프로그래밍 규칙에 따라 링크 편집되어야 합니다. 세부사항은 CICS 애플리케이션 프로그래머 참조서를 참조하십시오.
EGL 프로그램의 비EGL 프로그램에 대한 호출의 이상 종료 처리
CICS에는 EGL 프로그램이 비EGL COBOL 프로그램을 호출하는 데 CICS LINK 대신 COBOL CALL을 사용할 경우 적용되는 이상 종료 처리 고려사항이 있습니다. 이 상황에서 COBOL 런타임 환경은 호출 대상 프로그램에 대한 입력에서 호출 프로그램이 요청하는 CICS 이상 종료 처리를 사용 안함으로 설정합니다. 호출 대상 프로그램은 호출 대상 프로그램에 대한 입력에서 CICS POP HANDLE 문을 실행하고 호출 대상 프로그램의 엑시트에서 CICS PUSH HANDLE 문을 실행하여 EGL 프로그램에 대한 이상 종료 핸들러를 복원해야 합니다.
이상 종료 핸들러가 복원되지 않은 상태에서 호출 대상 프로그램에서 비정상 종료가 발생하면 EGL 프로그램에 대한 정상 오류 정리가 수행되지 않습니다. 프로그램이 비정상 종료되면 공유 테이블 사용 계수가 업데이트되지 않습니다. 이로 인해 스토리지에 불필요한 공유 테이블 사본이 남을 수 있습니다. 이상 종료 핸들러에서 Rational COBOL Runtime for zSeries 오류 메시지를 발행하지 않습니다.
CICS 환경에서 COBOL 호출을 사용하는 데 대한 자세한 정보는 사용자의 CICS 환경에 대한 애플리케이션 프로그래밍 안내서를 참조하십시오.
프로그램의 COMMPTR 정의 예제
EGL 프로그램이 비EGL 프로그램에 매개변수를 전달하기 위해 CICSLINK 및 COMMPTR을 사용하는 경우에는 이러한 매개변수에 대한 포인터가 CICS COMMAREA를 통해 전달됩니다. 다음 절에는 비EGL 프로그램이 CICSLINK 및 COMMPTR을 사용하여 전달된 매개변수를 수신하는 방법에 대한 예제가 표시되어 있습니다.
COMMPTR을 사용하여 CICSLINK로부터 매개변수를 수신하는 어셈블러 언어
L PARMPTR,DFHEICAP Address parameter list
USING PARMAREA,PARMPTR
L PARM1PTR,PARM1A Address parameter 1
USING PARM1,PARM1PTR
L PARM2PTR,PARM2A Address parameter 2
USING PARM2,PARM2PTR
L PARM3PTR,PARM3A Address parameter 3
USING PARM3,PARM3PTR
.
. And so on
.
PARMAREA DSECT Define storage layout of parmlist
PARM1A DS F Passed pointer to parameter 1
PARM2A DS F Passed pointer to parameter 2
PARM3A DS F Passed pointer to parameter 3
PARM1 DSECT Define storage layout of passed parm
RECORD EQU * Parameter is a record
FLD1 DS L10 Fields in record structure
FLD2 DS L20 " "
FLD3 DS L200 " "
.
. And so on
.
PARM2 DSECT Define storage layout of passed parm
L7701 DS L5 Parameter is single data item level-77
PARM3 DSECT Define storage layout of passed parm
WORKSTOR EQU * Parameter is working storage
FLD5 DS L5 Fields in working storage
FLD6 DS L5 " "
.
. And so on
.
COMMPTR을 사용하여 CICSLINK로부터 매개변수를 수신하는 COBOL
LINKAGE SECTION.
01 DFHCOMMAREA.
02 PARM1A USAGE IS POINTER.
02 PARM2A USAGE IS POINTER.
02 PARM3A USAGE IS POINTER.
01 PARM1.
02 RECORD.
03 FLD1 PIC X(10).
03 FLD2 PIC X(20).
03 FLD3 PIC X(200).
.
. And so on
.
01 PARM2.
02 L7701 PIC X(5).
01 PARM3.
02 WORKSTOR.
03 FLD5 PIC X(5).
03 FLD6 PIC X(5).
.
. And so on
.
PROCEDURE DIVISION.
SET ADDRESS OF PARM1 TO PARM1A
SET ADDRESS OF PARM2 TO PARM2A
SET ADDRESS OF PARM3 TO PARM3A
.
. And so on
.
비EGL 프로그램의 EGL 프로그램에 대한 호출
EGL 프로그램은 호출 대상 프로그램으로 정의되어야 합니다. 호출 비EGL 프로그램은 호출 대상 프로그램이 생성될 때 연계 옵션 파트에 지정되어 있는 대로 호출 대상 프로그램의 매개변수를 설정하는 작업을 수행합니다. 다양한 매개변수 형식에 대해 생성되는 연계에 대한 다이어그램은 CICS의 call 문 매개변수의 형식의 내용을 참조하십시오.
매개변수 목록에 있는 변수의 형식은 호출 대상 프로그램이 수신한 매개변수에 대해 지정된 정의와 일치해야 합니다. 이들이 동일하지 않은 경우에는 예기치 않은 결과가 발생할 수 있습니다.
EXEC CICS LINK
PROGRAM('MYAPPL') COMMAREA(record of pointers)
LENGTH(length of COMMAREA)
linkType이 DYNAMIC 또는 STATIC인 경우 종료 시에 호출 대상 EGL 프로그램은
COBOL 특수 레지스터 RETURN-CODE를 EGL 변수 sysVar.returnCode에 설정합니다. 레지스터 15에 저장되어 있는 이 리턴 코드는
호출 비EGL 프로그램에서 테스트할 수 있습니다. 런타임 서비스를 초기화하는 복수의 호출 방지
실행 단위에서 호출된 첫 번째 프로그램이 비EGL 프로그램이며 해당 프로그램에서 반복적으로 EGL 프로그램을 호출하는 경우 zSeries용 Rational COBOL Runtime은 각 호출마다 초기화 및 종료 함수를 수행합니다. 호출 수가 많은 경우 이러한 호출로 인한 오버헤드가 매우 커질 수 있습니다.
이러한 오버헤드를 방지하고 초기화 및 종료를 한 번만 수행하기 위해 EGL은 각 환경에 대한 랩퍼 프로그램을 제공합니다. 적절한 랩퍼 프로그램 및 기본 비EGL 프로그램을 사용한 링크 편집을 수행해야 합니다. 이를 수행하기 위해 다음 링크 편집 명령을 사용하여 YOURPROG 이름의 프로그램 이름을 대체할 수 있습니다. SELALMD는 런타임 서비스 로드 라이브러리를 나타냅니다.
이러한 랩퍼 프로그램은 기본 TWA 오프셋 값인 0으로 정의됩니다. 따라서 사용자의 CICS 환경에서 TWAOFFSET의 EGL 빌드 디스크립터 옵션을 0이 아닌 값으로 설정해야 하는 경우 이러한 랩퍼 프로그램이 정상적으로 작동하지 않습니다. 이 경우 IBM에서 해당 랩퍼를 위한 소스 코드를 제공할 수 있습니다. 소스 코드의 애플리케이션 프로파일 블록에 있는 TWA 오프셋 필드를 수동으로 수정한 후 업데이트된 랩퍼 프로그램을 컴파일하고, 링크하고, 사용할 수 있습니다.
다음 예제는 COMMDATA 형식의 매개변수가 필요한 EGL 프로그램을 위한 z/OS CICS 제어 명령문을 보여줍니다.
CHANGE NONVGRTN(YOURPROG)
INCLUDE SELALMD(ELAWCCSD)
ENTRY ELAWCCSD
NAME YOURPROG(R)
다음 예제는 COMMPTR 형식의 매개변수가 필요한 EGL 프로그램을 위한 z/OS CICS 제어 명령문을 보여줍니다.
CHANGE NONVGRTN(YOURPROG)
INCLUDE SELALMD(ELAWCCSP)
ENTRY ELAWCCSP
NAME YOURPROG(R)
