2015-08-20 3 views
1

У меня есть программа C, которая вызывает COBOL. Я хочу установить переключатели перед вызовом программы COBOL. Обычно это делается с использованием переменной среды COBSW.Настройка переключателей в микрофоне COBOL с использованием C

Когда я устанавливаю COBSW в программе C, это так, как оно игнорируется. Когда я устанавливаю COBSW перед вызовом программы, он обнаруживается штрафом.

Как я могу получить набор COBSW на C и распознать его COBOL?

Вот нечто я пытался:

  1. Я удалил cobinit() и программа все еще работает. Это указывает на то, что cobinit как-то автоматичен, когда запускается программа C, и она будет только набирать COBSW, установленную в sh.

  2. Я добавил программу cobrescanenv() в программу.

  3. Переведено cobinit() перед cobputenv().

Вот скрипт ш, который проходит тест:

export C_INCLUDE_PATH=$COBDIR/include 

PATH=$COBDIR/bin:$PATH 

gcc -o callcobol.o -c -g -Wall -Wno-unused-variable -fPIC -Ibuild -Isrc callcobol.c 

/opt/microfocus/VisualCOBOL/bin/cob -o callcobol -g callcobol.o -L/usr/local/lib -ldl -lrt -lpthread 

cob -z cobsw.cbl -o TESTSW.so 

unset COBSW 
echo "Test ONE, COBSW not set:" 
echo "We want the output to be:" 
echo "SW0=ON sw1=ON sw2=ON sw3=ON sw4=ON sw5=ON sw6=OFF sw7=ON " 
echo "Getting:" 
./callcobol 

#    Output: 
#      value of COBSW is: +0+1+2+3+4+5-6+7 
echo "" 
echo "" 

export COBSW=+1+2 # This should be ignore because we are setting COBSW in the c program. 
echo "Test TWO, COBSW set to ${COBSW}, but should be overlaid by putenv() in C:" 
echo "We want the output to be:" 
echo "SW0=ON sw1=ON sw2=ON sw3=ON sw4=ON sw5=ON sw6=OFF sw7=ON " 
echo "Getting:" 
./callcobol 

Вот callcobol.c:

#include <stdlib.h> 
#include <stdio.h> 
#include "cobcall.h" 
#include "cobmain.h" 
#include "cobenv.h" 
PFR cobgetfuncaddr(int type, const cobchar_t *name); 
int cobinit (void); 

int main(int argc, char *argv[]) 
{ 
    cobchar_t *prog = (cobchar_t *) "TESTSW"; 
    //char *cobswval; 
    const char *cobswname = "COBSW"; 

    cobputenv((cobchar_t *) "COBSW=+0+1+2+3+4+5-6+7"); // out dummy computed SWITCH values for the program 
    //cobswval = getenv(cobswname); 
    //fprintf(stdout,"value of COBSW is: %s\n", cobswval); 
    cobinit();    /* Initialize COBOL environment */ 
    cobrescanenv(); 

    PFR cobprog; 

    if ((cobprog = cobgetfuncaddr(0, prog)) == NULL) 
    { 
     fprintf(stderr,"ERROR: could not find cobol module %s\n", (char *) prog); 
    } 
    else 
    { 
     /* Loaded */ 
     (*cobprog)(); /* Call it! */ 
    } 

    cobtidy();    /* Close down COBOL environment */ 

    return(0); // return a return code of zero 
} 

Вот cobsw.cbl:

$SET CONFIRM 
    $SET IBMCOMP 
    $SET CHARSET"EBCDIC" 
    IDENTIFICATION DIVISION. 
    PROGRAM-ID. TESTSW. 
    ENVIRONMENT DIVISION. 
    CONFIGURATION SECTION. 
    SPECIAL-NAMES. 
    SWITCH-0 IS SW0 ON IS SW_0_ON 
    SWITCH-1 IS SW1 ON IS SW_1_ON 
    UPSI-2 ON IS SW_2_ON 
    UPSI-3 ON IS SW_3_ON 
    UPSI-4 ON IS SW_4_ON 
    UPSI-5 ON IS SW_5_ON 
    UPSI-6 ON IS SW_6_ON 
    UPSI-7 ON IS SW_7_ON. 
    INPUT-OUTPUT SECTION. 
    FILE-CONTROL. 
    DATA DIVISION. 
    FILE SECTION. 
    WORKING-STORAGE SECTION. 
    01 rec-cnt pic 9(11) value zero. 
    01 sw-out. 
     02 filler  pic x(4) value "SW0=". 
     02 SW0-status pic x(3). 
     02 filler  pic x(5) value " sw1=". 
     02 SW1-status pic x(3). 
     02 filler  pic x(5) value " sw2=". 
     02 SW2-status pic x(3). 
     02 filler  pic x(5) value " sw3=". 
     02 SW3-status pic x(3). 
     02 filler  pic x(5) value " sw4=". 
     02 SW4-status pic x(3). 
     02 filler  pic x(5) value " sw5=". 
     02 SW5-status pic x(3). 
     02 filler  pic x(5) value " sw6=". 
     02 SW6-status pic x(3). 
     02 filler  pic x(5) value " sw7=". 
     02 SW7-status pic x(3). 
    01 acc-data pic x(80) value spaces. 
    LINKAGE SECTION. 
    PROCEDURE DIVISION. 
    MAIN-PARAGRAPH. 
     move "OFF" to SW0-status SW1-status SW2-status 
        SW3-status SW4-status SW5-status 
        SW6-status SW7-status. 

     IF SW_0_ON move "ON " to SW0-status. 
     IF SW_1_ON move "ON " to SW1-status. 
     IF SW_2_ON move "ON " to SW2-status. 
     IF SW_3_ON move "ON " to SW3-status. 
     IF SW_4_ON move "ON " to SW4-status. 
     IF SW_5_ON move "ON " to SW5-status. 
     IF SW_6_ON move "ON " to SW6-status. 
     IF SW_7_ON move "ON " to SW7-status. 
     display sw-out. 
     EXIT PROGRAM. 
    END PROGRAM TESTSW. 

Вот сценарий выход:

Test ONE, COBSW not set: 
We want the output to be: 
SW0=ON sw1=ON sw2=ON sw3=ON sw4=ON sw5=ON sw6=OFF sw7=ON 
Getting: 
SW0=OFF sw1=OFF sw2=OFF sw3=OFF sw4=OFF sw5=OFF sw6=OFF sw7=OFF 


Test TWO, COBSW set to +1+2, but should be overlaid by putenv() in C: 
We want the output to be: 
SW0=ON sw1=ON sw2=ON sw3=ON sw4=ON sw5=ON sw6=OFF sw7=ON 
Getting: 
SW0=OFF sw1=ON sw2=ON sw3=OFF sw4=OFF sw5=OFF sw6=OFF sw7=OFF 
+0

В общих чертах вы устанавливаете переключатели только в среде, загруженной для запуска первой программы. Вам нужно найти способ экспортировать их из C в основную среду, чтобы программа COBOL имела доступ. –

+0

Программа COBOL работает в этом процессе и в той же среде, что и программа C. В этом случае программа COBOL похожа на функцию, а не на отдельную программу. С помощью этой новой информации вы могли бы подробнее остановиться на своем заявлении. Возможно, скажите нам, что такое «Мастер-среда». –

+1

С того момента, как я прочитал ваш сценарий, C на самом деле не вызывает COBOL, это оболочка. В обычной ОС оболочка содержит среду. Для запуска приложения C создается новая оболочка (с скопированной средой). Приложение C обновляет эту среду. Когда он заканчивается, эта среда отбрасывается, поэтому оболочка, которая запускает COBOL, имеет исходную (немодифицированную) среду. Либо C должен непосредственно порождать COBOL с его копией среды, либо вам нужно экспортировать версию C оболочки обратно в родительскую оболочку. –

ответ

1

Коммутаторы среды COBOL считываются один раз из переменной окружения COBSW или командной строки во время инициализации процесса.

Так что, к сожалению, установка COBSW не будет работать, потому что среда выполнения уже читает COBSW.

Все не потеряно, потому что вы можете использовать X"91" function 11 API от COBOL для установки переключателей.

+1

Итак, какой смысл в Micro Focus, поставляющем 'cobrescanenv()'? –

+1

cobrescanenv собирает изменения переменных среды DD_, переменных среды набора пользователей и среды сопоставления точек входа, но не, к сожалению, COBSW. Я бы предположил, что это возможно, но это не так. –

+0

OK. В примере, cobputenv находится перед coboinit. Согласно OP, cobgetenv показывает set/put с ожидаемым значением. OP действительно сказал, что программа COBOL по-прежнему работает, если cobinit опущен. Любая идея создания среды выполнения? –