Информация DCL между процессом и подпроцессом

Я пытаюсь передать информацию между основным процессом и подпроцессом (изучая, как все это работает в процессе). Мне нужно получить информацию от подпроцесса, в данном случае значение g_start. Это то, как я видел в Интернете, чтобы справиться с этим, если есть лучший способ, пожалуйста, дайте мне знать!

Основной файл содержит

$ define/job/nolog g_start false
$ g_test == 6
$ spawn @test.com
$ if f$trnlnm(g_start) .eqs. true
$ then

Файл test.com содержит:

$ If g_test .nes. 5 
$ then
$ define/job g_start true
$ endif
$ logout

При запуске основного файла g_test не найден, что я делаю неправильно, что я не получаю данные для передачи туда и обратно между основными процессами и подпроцессами.


person user1943219    schedule 20.02.2013    source источник
comment
Вероятно, вы хотели заключить логическое имя в кавычки: f$trnlnm( "g_start" ).   -  person HABO    schedule 20.02.2013


Ответы (2)


Символы DCL (g_test) не являются общими для процессов. Использование общих логических имен, например. в таблице заданий, будет работать.

Более продвинутые средства связи, например. передача сообщений может осуществляться с помощью почтовых ящиков.

EDIT: чтобы уточнить, spawn/symbols вызовет копирование символов в подпроцесс при создании, но это создает новый набор символов. Затем родительский процесс идет своим чередом, и любые обновления символов в любом процессе происходят независимо.

person HABO    schedule 20.02.2013
comment
Значит, $define/job g_start true не устанавливает общее логическое имя? Совершенно новичок в VMS/DCL извините - person user1943219; 20.02.2013
comment
@user1943219 user1943219 - Да, define/job устанавливает значение общего логического. Любой процесс в задании, также известный как дерево процессов, может создавать/читать/обновлять/удалять (CRUD) логические элементы в таблице заданий. Поскольку таблица является общей, все процессы увидят любые изменения. - person HABO; 20.02.2013

Я смог решить это, опечатка с моей стороны, я думаю.

Файл 1:

$ define/job g_start false
$ g_test == 6
$ spawn @test.com
$ result = f$trnlnm("g_start")
$ write sys$output ''result'
$ if (''result' .eq. "true")
$ then

Файл 2:

$ If g_test .nes. 5 
$ then
$ define/job g_start true
$ endif
$ logout
person user1943219    schedule 20.02.2013
comment
Удаление spawn действительно упрощает ситуацию. Еще одна опечатка? - person HABO; 20.02.2013
comment
Да, при копировании/вставке из блокнота я пропустил команду spawn, она была в рабочей копии. обновлено выше - person user1943219; 21.02.2013