Вызов 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 перед вызовом библиотеки не решило мою проблему.


person Philip    schedule 28.01.2013    source источник
comment
Я так понимаю, что вы не можете модифицировать библиотеку C, поскольку в противном случае это казалось бы очевидным вариантом... В таком случае действительно ли имеет смысл помечать C в этом? Та же проблема может возникнуть при использовании библиотеки C++. Означает ли это, что вы также должны пометить C++?   -  person autistic    schedule 28.01.2013
comment
@modifiedlvalue: я не могу изменить библиотеку C. Однако я могу изменить модуль C, который вызывает библиотеку C, поэтому, если есть решение, основанное на изменении модуля C, я тоже был бы счастлив.   -  person Philip    schedule 28.01.2013
comment
Ваш HP-Non-Stop/Tandem не является мейнфреймом в значении тега. Если бы вы могли удалить это, это уменьшило бы возможную путаницу.   -  person Bill Woodger    schedule 28.01.2013


Ответы (3)


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

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

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

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

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

person Bill Woodger    schedule 28.01.2013
comment
PARAM SAVE-ENVIRONMENT ON заставляет программы COBOL сохранять переменные среды (которые они получают в виде сообщений при запуске) для будущих вызовов getenv() из модулей C. На самом деле библиотека, которую я использую, пытается открыть stderr, потому что не может читать переменные среды. Смотрите мой ответ для полного описания. - person Philip; 28.01.2013

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

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

  • СМЕШИВАЙТЕ COBOL и C (и Fortran, и Ada, и Vala, и Python, и Java, и...)
  • ИСПОЛЬЗУЙТЕ КОБОЛ
person Brian Tiffin    schedule 28.01.2013
comment
Мне нравится твой пост! Что касается вашего вопроса: ОС HP NonStop поставляется в двух так называемых личностях: Guardian и OSS. В моей компании мы используем Guardian, что делает MS-DOS похожей на эталонную реализацию POSIX. Компилятор C в значительной степени совместим с ISO, а библиотека C реализует большую часть POSIX. Однако, чтобы использовать те функции, которые делают HP NonStop на 500 000 долларов дороже ПК, вы вынуждены жертвовать портативностью. HP существенно расширила ISO C и POSIX до такой степени, что вы едва понимаете, что смотрите на исходный код C. - person Philip; 29.01.2013
comment
И вы правы, stderr обычно виден глобально. Однако задача стандартного кода запуска библиотеки C состоит в том, чтобы присвоить ему некоторое полезное значение, чего он не делает, если основная точка входа не была создана кодом C, по крайней мере, здесь. И Guardian, и COBOL85 не реализуют концепцию stderr. - person Philip; 29.01.2013

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

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

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

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

  • Не смешивайте COBOL и C.
  • Не используйте COBOL вообще.
person Philip    schedule 28.01.2013
comment
Есть ли недостатки в использовании ?SAVE? Ваш компилятор Cobol может быть очень устаревшим (я видел кое-что из Tandem в сентябре прошлого года, и это был Cobol '74). Если у вас есть старые программы, вы, возможно, не сможете избежать Cobol, поэтому лучше выяснить (что, возможно, у вас есть), как заставить его работать с C. Вы можете быть удивлены относительной производительностью между C и Cobol с помощью тип файлов данных, которые существуют на вашем сайте :-) - person Bill Woodger; 28.01.2013
comment
На самом деле компании нужны программы на языке COBOL (за исключением нескольких редких случаев). Около 90% нашей кодовой базы — это COBOL, и после нескольких месяцев работы здесь я должен признать, что COBOL идеально подходит для поставленной задачи. Это просто ужасно некрасиво. Но помимо проблемы, описанной здесь, я поражен тем, насколько хорошо он взаимодействует с C. - person Philip; 28.01.2013
comment
Можете ли вы отредактировать свой ответ, чтобы повысить уровень директив? SAVE STARTUP и? SAVE ALL? Я думаю, что они являются реальным ответом на ваш первоначальный вопрос, другая часть в основном представляет собой переформулировку вашего первоначального вопроса. (Поздравляю с тем, что вы это поняли — к тому времени, когда вы проработаете в руководстве нативные/не нативные, CRE/не CRE, OSS/Guardian, часто возникает искушение выбросить полотенце из-за этих смешанных языковых проблем.) - person Andy Simpson; 14.02.2013