0

从我的 COBOL 程序中,我调用了我的 C 模块,它本身调用了一个专有库。这个库坚持写到,尽管由于主程序是用 COBOL 编写的stderr,所以没有可用的。stderr因此,程序中止并显示以下消息:

cannnot open stderr


惠普的支持人员建议我发布

PARAM SAVE-ENVIRONMENT ON

在运行程序之前在 TACL 中。这确实解决了我的问题。但是,我的程序将被多个脚本中的几个人使用,我不想强​​迫他们PARAM SAVE-ENVIRONMENT ON在运行程序之前发布。

是否有一些 COBOL85 指令允许我在不手动更改任何参数的情况下正确运行程序?就像是

?PARAM SAVE-ENVIRONMENT ON

会很好...

编辑:

因为我能够修改 C 模块(而不是库),所以我对基于 C 的解决方案完全满意。但是,stderr在调用库之前简单地打开并不能解决我的问题。

4

3 回答 3

1

如果你可以从 Cobol 执行 TACL 命令,那就可以了。

您可以在分配给 stderr 的 Cobol 中打开文件吗?也许确切地发现 PARAM SAVE-ENVIRONMENT ON 的作用可能也会有所帮助。

大多数 C 贡献者不会了解 HP/Tandem 上的操作系统,这会影响答案的价值。我不知道您是否可以从您的 C 程序中“退出”以发出 TACL 命令或运行 TACL 脚本。

对你的 HP/Tandem 的 Cobol、TACL 和 C 手册进行一些研究可能会引导你找到答案,也许还有一两个谷歌。

无论如何,在他们的脚本中包含该语句有什么问题?如果他们希望程序正常工作?

于 2013-01-28T11:25:50.940 回答
1

作为 HP NonStop 开发人员,我有一些问题。stderr 是 C 中的一个特殊符号。文件通道 2(0 标准输入,1 标准输出,2 标准错误),但这些是低级通道号。stderr 是指向 FILE 结构的默认指针。回到 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 使用什么编程语言无关紧要。HP NonStop 与其他 POSIX-ey 系统有那么大的不同吗?stderr(文件指针)通常对包含 stdio.h 的任何代码都是全局的

顺便说一句,来自 OpenCOBOL 和 GNU/Linux 的粉丝:关于你对经验教训的其他评论,

  • 务必混合使用 COBOL 和 C(以及 Fortran、Ada、Vala、Python、Java 和 ...)
  • 一定要使用 COBOL
于 2013-01-28T17:32:17.360 回答
0

PARAM SAVE-ENVIRONMENT ON使 HP COBOL 程序保存环境变量(它们在启动时从 Guardian 作为消息接收)以供将来getenv()从 C 模块调用。

实际上,我正在使用的库试图打开stderr,因为它无法读取环境变量。一种解决方案是将 设置PARAM SAVE-ENVIRONMENTON,以便getenv()再次正常运行。这必须在每个 TACL 会话中完成。

除非:您在 COBOL 程序中使用?SAVE STARTUP- 或 -指令来达到相同的效果。?SAVE ALL

得到教训:

  • 不要混合 COBOL 和 C。
  • 根本不要使用 COBOL。
于 2013-01-28T15:45:54.823 回答