使用C语言设置微焦点COBOL中的开关
我有一个调用COBOL的C程序。我想在调用COBOL程序之前设置开关。这通常是使用COBSW环境变量完成的 当我在C程序中设置COBSW时,它被忽略了。 当我在调用程序之前设置COBSW时,检测结果良好 如何在C中设置COBSW并让COBOL识别它 以下是我尝试过的一些事情:使用C语言设置微焦点COBOL中的开关,cobol,microfocus,Cobol,Microfocus,我有一个调用COBOL的C程序。我想在调用COBOL程序之前设置开关。这通常是使用COBSW环境变量完成的 当我在C程序中设置COBSW时,它被忽略了。 当我在调用程序之前设置COBSW时,检测结果良好 如何在C中设置COBSW并让COBOL识别它 以下是我尝试过的一些事情: 我删除了cobinit(),程序仍在运行。这向我表明,当C程序启动时,cobinit在某种程度上是自动的,它将只拾取在sh中设置的COBSW 我将cobrescanenv()添加到程序中 将cobinit()移到cobpu
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
}
以下是脚本输出:
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
在进程初始化期间,从环境变量COBSW或命令行读取一次COBOL运行时开关 因此,不幸的是,设置COBSW将不起作用,因为运行时已经 阅读COBSW
因为您可以使用from COBOL设置开关,所以不会丢失所有开关。一般来说,您只是在加载以运行第一个程序的环境中设置开关。您需要找到一种方法将它们从C导出到主环境,以便COBOL程序能够访问。COBOL程序正在进程中运行,并且与C程序在相同的环境中运行。在这种情况下,COBOL程序就像一个函数,而不是一个独立的程序。有了这些新信息,你能详细说明一下你的陈述吗。也许告诉我们什么是“主环境”。从我阅读脚本的方式来看,C实际上并没有调用COBOL,而shell是。在典型的操作系统中,shell保存环境。生成一个新的shell(使用复制的环境)来运行C应用程序。C应用程序更新该环境。当它结束时,该环境被丢弃,因此启动COBOL的shell具有原始(未修改)环境。C必须直接使用其环境副本生成COBOL,或者您需要将外壳的C版本导出回父外壳。Brian,请查看C代码而不是外壳脚本,您将看到COBOL作为C代码的函数被调用的位置。请显示callcobol,好吗?还有您正在使用的Micro Focus COBOL的确切版本和名称。那么Micro Focus提供
cobrescanenv()
的意义是什么呢?cobrescanenv可以获取DD_uu环境变量、用户设置环境变量和入口点映射环境的更改,但不幸的是,COBSW不能。我可以想象,但事实并非如此。该程序是用“cob”编译的,这确保了Micro Focus COBOL运行时环境的设置,因此在本例中,cobinit()的作用很小,因为环境已经设置好了。cobputenv()正在运行,但运行时没有注意到COBSW已更改为重新解析它以设置COBOL开关。因此我提到x“91”fn 11 API。cobinit()在静态链接环境中很有用。Micro Focus提供了一个“自包含”的共享对象,在加载共享对象本身时初始化运行时,这不需要cobinit()。谢谢。我很满意。你能用这些东西更新你的答案吗?因此,它是各种微焦点文档中的“东西”的应用,我猜它们之间不会相互合作:-)
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