У меня есть множество подпрограмм M-Code, поставляемых поставщиками как часть гораздо более крупного продукта, который использует READ
и WRITE
напрямую для взаимодействия с текущим устройством. Я не могу изменить этот код. Я хочу обернуть некоторые из этих подпрограмм в систему, в которой я могу вводить ввод и получать вывод в интерактивном режиме.
В настоящее время это реализуется путем открытия TCP-соединения с удаленным хостом и создания его текущим устройством. READ
и WRITE
действительно подключены к сокету. Это довольно неудобно, так как требует настройки отдельной службы, которая прослушивает TCP-сокет, и координации с локальным заданием, чтобы весь процесс работал. Я также должен отключить nagle и пропустить буферизацию, иначе соединение станет управляемым с задержкой или зависнет. (например, параметр TCP OPEN /SEN=1
, также известный как +Q
). К сожалению, это приводит к большому количеству 1-байтовых TCP-сегментов, а также очень неэффективно.
Я бы предпочел управлять всем взаимодействием через один процесс. В идеале я мог бы сделать так, чтобы вызовы READ
, WRITE
и других функций, работающих на текущем устройстве, запускали некоторый М-код или обратные вызовы в интерфейс Caché Callin C или пользовательский модуль расширения для обеспечения необходимых функций на серверной части. Таким образом, я могу управлять вводом-выводом на своих условиях, не нуждаясь в координации между процессами. Однако я не смог найти точку входа, чтобы настроить это.
Есть ли в Caché такая вещь, как определяемое пользователем устройство?
Для хостов UNIX существует способ использовать существующий файловый дескриптор в качестве устройства, который может быть полезен, но, похоже, не реализован в Windows.
Я подумал о том, чтобы создать новый процесс, чтобы Windows перенаправляла STDIN
и STDOUT
с помощью SetStdHandle для каналов, которыми я управляю из того же процесса, используйте Callin для подключения к Caché и разрешите ему использовать устройство по умолчанию, которое должно быть STDIN
и STDOUT
. Кто-нибудь знает, действительно ли это сработает?