从我的COBOL程序中,我调用我的C模块,它本身调用一个专有库。这个库坚持要写入stderr,尽管没有可用的stderr,因为主程序是用COBOL编写的。因此,该程序以下列消息中止:
cannnot open stderr惠普的支持人员建议我发布
PARAM SAVE-ENVIRONMENT ON在运行程序之前。这确实解决了我的问题。但是,我的程序将被多个脚本中的人使用,我不想强迫他们在运行程序之前发布PARAM SAVE-ENVIRONMENT ON。
是否有一些COBOL85指令,允许我在不手动更改任何参数的情况下正确运行程序?有点像
?PARAM SAVE-ENVIRONMENT ON会很棒的..。
编辑:
因为我能够修改C模块(而不是库),所以我会完全满足于基于C的解决方案。但是,在调用库之前简单地打开stderr并不能解决我的问题。
发布于 2013-01-28 15:45:54
PARAM SAVE-ENVIRONMENT ON使HP程序保存环境变量(它们在卫报启动时作为消息接收),以便将来从C模块调用getenv()。
实际上,我使用的库试图打开stderr,因为它不能读取环境变量。一种解决方案是将PARAM SAVE-ENVIRONMENT设置为ON,这样getenv()将再次正常工作。这必须在每个环节中进行。
除非:您在COBOL程序中使用?SAVE STARTUP-或?SAVE ALL-directive来达到同样的效果。
汲取的经验教训:
发布于 2013-01-28 11:25:50
如果您可以从Cobol执行TACL命令,就可以执行。
您能在Cobol中打开一个对stderr的解析文件吗?也许,准确地发现PARAM所保存的环境所做的事情也会有所帮助。
大多数C贡献者都不会知道惠普/串列上的操作系统,这将影响答案的价值。我不知道你是否可以从你的C程序“外壳”发出一个TACL命令或运行一个TACL脚本。
使用Cobol、TACL和C手册对惠普/串联系统进行一些研究,可能会让你找到答案,或许还有一两个谷歌。
在他们的脚本中包含这个语句有什么问题?如果他们想让这个计划成功的话?
发布于 2013-01-28 17:32:17
我不是惠普的NonStop开发人员,我有一些问题。stderr是C. File channel 2中的一个特殊符号(0标准in,1标准out,2标准错误),但这些都是低级信道号。stderr是指向文件结构的默认指针。回到GNU/Linux,/usr/include/stdio.h将它们定义为
/* Standard streams. */
extern struct _IO_FILE *stdin; /* Standard input stream. */
extern struct _IO_FILE *stdout; /* Standard output stream. */
extern struct _IO_FILE *stderr; /* Standard error output stream. */
/* C89/C99 say they're macros. Make them happy. */
#define stdin stdin
#define stdout stdout
#define stderr stderr打开一个名为"stderr“的文件不是一回事。创建的任何进程都应该已经打开0、1和2。应该不重要的是,什么编程语言是用于main。惠普NonStop和其他POSIX-ey系统有那么大的不同吗?stderr (文件指针)通常对任何包含stdio.h的代码都是全局的。
顺便说一句,来自一个OpenCOBOL和GNU/Linux爱好者:关于您对经验教训的其他评论,
https://stackoverflow.com/questions/14559666
复制相似问题