Вызов C из COBOL: проблема с stderr

Из моей программы COBOL я вызываю мой модуль C, который сам делает вызовы в проприетарную библиотеку. Эта библиотека настаивает на написании stderrхотя нет stderr доступно, так как основная программа написана на языке COBOL. Следовательно, программа прерывается с этим сообщением:

cannnot open stderr


Ребята из службы поддержки HP посоветовали мне выпустить

PARAM SAVE-ENVIRONMENT ON

в TACL перед запуском программы. Это действительно решило мою проблему. Тем не менее, моя программа будет использоваться несколькими людьми в нескольких сценариях, и я не хочу заставлять их выдавать PARAM SAVE-ENVIRONMENT ON до запуска программы.

Существует ли какая-либо директива COBOL85, которая позволяет мне правильно запускать программу без изменения каких-либо параметров вручную? Что-то вроде

?PARAM SAVE-ENVIRONMENT ON

было бы замечательно...

РЕДАКТИРОВАТЬ:

Так как я могу изменять модуль C (не библиотеку), я был бы полностью удовлетворен решением на основе C. Тем не менее, просто открытие stderr до звонка в библиотеку не решила мою проблему.

3 ответа

Решение

PARAM SAVE-ENVIRONMENT ON заставляет программы HP COBOL сохранять переменные среды (которые они получают в виде сообщений при запуске от Guardian) для будущих вызовов getenv() из модулей C.

На самом деле, библиотека, которую я использую, пытается открыть stderr потому что он не может читать переменные окружения. Одним из решений является установка PARAM SAVE-ENVIRONMENT в ON, так getenv() будет правильно функционировать снова. Это должно быть сделано в каждом сеансе TACL.

Если только вы не используете ?SAVE STARTUP- или же ?SAVE ALL-Directive в вашей программе COBOL для достижения того же эффекта.

Уроки выучены:

  • Не смешивайте COBOL и C.
  • Не используйте Кобол вообще.

Не будучи разработчиком 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. Не должно иметь значения, какой язык программирования используется для основного. HP NonStop сильно отличается от других систем POSIX-EY? stderr (указатель FILE) обычно глобален для любого кода, который включает stdio.h

Кроме того, от фаната OpenCOBOL и GNU / Linux: Что касается вашего другого комментария к извлеченным урокам,

  • СЛЕДУЕТ смешивать COBOL и C (и Фортран, и Ада, и Вала, и Питон, и Яву, и...)
  • Использовать кобол

Если вы можете выполнять команды TACL из Cobol, это может сделать это.

Можете ли вы открыть файл в Cobol в виде stderr? Возможно, также поможет открытие именно того, что делает PARAM SAVE-ENVIRONMENT ON.

Большинство участников C не будут знать операционную систему HP/Tandem, которая повлияет на ценность ответов. Я понятия не имею, можете ли вы "выложить" из своей программы на C команду TACL или запустить скрипт TACL.

Небольшое исследование ваших руководств по Cobol, TACL и C для HP / Tandem может привести вас к ответам, возможно, к Google или двум.

В чем проблема с включением оператора в их сценарии? Если они хотят, чтобы программа работала?

Другие вопросы по тегам