0

私の COBOL プログラムから、独自のライブラリを呼び出す C モジュールを呼び出しています。このライブラリは への書き込みを要求していますが、メイン プログラムは COBOL で作成されているため利用できstderrません。stderrその結果、プログラムは次のメッセージで中止されます。

cannnot open stderr


HPのサポート担当者は、発行するようにアドバイスしました

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 (FILE ポインター) は通常、stdio.h を含むすべてのコードに対してグローバルです。

余談ですが、OpenCOBOL と GNU/Linux のファンボーイから: 学んだ教訓に関する他のコメントについては、

  • DO COBOL と C (および Fortran、Ada、Vala、Python、Java など) を混在させます。
  • COBOLを使用してください
于 2013-01-28T17:32:17.360 に答える
0

PARAM SAVE-ENVIRONMENT ONHP COBOLプログラムに環境変数(Guardianからの起動時にメッセージとして受信)を保存させgetenv()、Cモジュールからの将来の呼び出しに備えます。

実際、私が使用しているライブラリは、stderr環境変数を読み取れないため、開こうとします。解決策の1つは、をに設定するPARAM SAVE-ENVIRONMENTことです。ONこれにより、getenv()再び正しく機能します。これは、各TACLセッションで実行する必要があります。

ただし、COBOLプログラムで?SAVE STARTUP-または-ディレクティブを使用して同じ効果を達成する場合を除きます。?SAVE ALL

学んだ教訓:

  • COBOLとCを混在させないでください。
  • COBOLはまったく使用しないでください。
于 2013-01-28T15:45:54.823 に答える