Вызов 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 или двум.
В чем проблема с включением оператора в их сценарии? Если они хотят, чтобы программа работала?