21

Re: Процедура Halt в Free Pascal

Ви так і не відповіли на питання, яку саме інформацію ви хочете видавати з неї ОДНОЧАСНО з виведенням веб-сторінки.

22

Re: Процедура Halt в Free Pascal

koala написав:

Ви так і не відповіли на питання, яку саме інформацію ви хочете видавати з неї ОДНОЧАСНО з виведенням веб-сторінки.

Якщо перечитати все з самого початку, то мабуть було б зрозуміло. Гаразд, спробую коротко:
при певних умовах програма виводить веб-сторінку в stdout і після цього повинна передати код свого завершення іншому процесові. Зрозуміло, що через stdout це робити не можна, бо зіпсується вигляд сторінки.

23

Re: Процедура Halt в Free Pascal

hadeix написав:
koala написав:

Ви так і не відповіли на питання, яку саме інформацію ви хочете видавати з неї ОДНОЧАСНО з виведенням веб-сторінки.

Якщо перечитати все з самого початку, то мабуть було б зрозуміло. Гаразд, спробую коротко:
при певних умовах програма виводить веб-сторінку в stdout і після цього повинна передати код свого завершення іншому процесові. Зрозуміло, що через stdout це робити не можна, бо зіпсується вигляд сторінки.

Ні, не зрозуміло. Вона не повинна передавати код помилки, якщо помилки не сталося, а код завершення призначається саме для зберігання коду помилки. Ви хочете передати якусь іншу інформацію. Яку саме? Можете не коротко, якби мені було шкода часу, я б взагалі вам не відповідав.

Подякували: leofun011

24

Re: Процедура Halt в Free Pascal

koala написав:

Ні, не зрозуміло. Вона не повинна передавати код помилки, якщо помилки не сталося, а код завершення призначається саме для зберігання коду помилки. Ви хочете передати якусь іншу інформацію. Яку саме? Можете не коротко, якби мені було шкода часу, я б взагалі вам не відповідав.

Програма відпрацьовує певні задачі, в залежності від результатів формує із шаблонів та виводить якусь із веб-сторінок в stdout, плюс виставляються відповідні біти "вихідного регістра" (назвемо його так, раз Вам не подобається "код завершення"), і число яке ми отримали в "вихідному регістрі" потрібно передати іншому процесові (bash-скрипту, наприклад. Причому програма може запускатися  на початку цього скрипта і результат оброблятися ним нижче), де біти перевіряються по масці за допомогою логічної функції AND, і, відповідно, виконуються потрібні дії шляхом запуску сторонніх програм.
Поки що проблему передачі вмісту "вихідного регістра" вирішив шляхом запису його значення в файл. Але цей спосіб мені не подобається.

25

Re: Процедура Halt в Free Pascal

Ви весь час намагаєтеся описати СПОСІБ, а не МЕТУ. Регістр, код, біти маски - це СПОСІБ, розумієте? Вам треба передати інформацію з програми в скрипт. Нащо? Чому програма не може виконати ці ж дії? Чому їх не може виконати веб-сервер - який, до речі, такою дурнею, як обробка побітова кодів помилки, не страждає.
Розумієте, у вас є командна оболонка. Це - велика складна програма; припущу навіть, що складніша за вашу. Але вам чомусь обов'язково її треба використати, і передати дані саме в неї. Чому? CGI не передбачає її використання; та й ви, хоче пишете на початку про CGI, далі про нього не згадуєте. В усіх цих кодах, регістрах, бітах, масках немає CGI.

Подякували: leofun011

26

Re: Процедура Halt в Free Pascal

koala написав:

хочете передати якусь іншу інформацію. Яку саме?

Ну не хоче він відповідати на це питання. Може в нього там секретні матеріали.

hadeix написав:

виставляються відповідні біти "вихідного регістра" (назвемо його так, раз Вам не подобається "код завершення"), і число яке ми отримали в "вихідному регістрі" потрібно передати іншому процесові ...
біти ...

А що означають ці біти ?

Подякували: hadeix1

27 Востаннє редагувалося hadeix (31.07.2019 15:09:27)

Re: Процедура Halt в Free Pascal

leofun01 написав:
koala написав:

хочете передати якусь іншу інформацію. Яку саме?

Ну не хоче він відповідати на це питання. Може в нього там секретні матеріали.

Ну хоч хтось мене розуміє  ;)  Дійсно, яка різниця що там за інформація передається ?

leofun01 написав:
hadeix написав:

виставляються відповідні біти "вихідного регістра" (назвемо його так, раз Вам не подобається "код завершення"), і число яке ми отримали в "вихідному регістрі" потрібно передати іншому процесові ...
біти ...

А що означають ці біти ?

Що завгодно, в залежності від налаштувань програми в конфігураційному файлі.
Наприклад, один із варіантів: в залежності від попередніх результатів та умов, користувачу відвантажується відповідна веб-сторінка, де він повинен проставити потрібні "галочки". Далі через CGI цей результат віддається моїй програмі (я вже називав її раніше умовно "CGI-процесором"), вона виводить, використовуючи відповідний шаблон, чергову веб-сторінку в stdout і, в залежності від проставлених "галочок" на попередній сторінці, встановлюються відповідні біти "вихідного регістру".  Все, програма завершилася. Але дані цього "регістру" обробляються далі в bash-скрипту і по результатам запускаються зовсім сторонні програми.
Моя програма -- всього лише допоміжний інструмент, щоб значно полегшити написання CGI-скриптів у вигляді bash. Вона уміє авторизувати користувача, просто тупо сформувати по шаблону (замінює в ньому аліаси на реальні значення) веб-сторінку, відправити її в stdout та заповнити "вихідний регістр", або в залежності від вхідних по CGI даних зробити аналогічні дії використовуючи для кожного випадку свої web-шаблони та формуючи дані в "вихідному регістрі".
Всі налаштування задаються в текстовому конфігураційному файлі.
Її можна запускати як самостійний CGI-скрипт, або у складі CGI-скрипта у вигляді bash.
Та задача що стояла у мене з самого початку вирішена, все чудово працює, результат цілком усіх задовольняє. Лише мені особисто не подобається передавати результати виконання програми в інші процеси через файл. От і все.
Ну якщо вже кому так приспічило взнати що за початкова задача -- то це віддалене керування апаратурою. Поки що через звичайний комп. Далі планується застосувати замість нього дешевий і набагато менш ненажерливий Raspberry Pi.

Подякували: leofun011

28

Re: Процедура Halt в Free Pascal

А чому не можна викликати інші програми одразу з Паскаля? Уникнете кількох зайвих операцій.
https://www.freepascal.org/docs-html/rtl/dos/exec.html
До речі, зверніть увагу, що The Exit value of the program can be consulted with the DosExitCode function, але при цьому DosExitCode contains (in the low byte) the exit-code of a program executed with the Exec call.
https://www.freepascal.org/docs-html/rt … tcode.html

29

Re: Процедура Halt в Free Pascal

koala написав:

А чому не можна викликати інші програми одразу з Паскаля? Уникнете кількох зайвих операцій.
https://www.freepascal.org/docs-html/rtl/dos/exec.html
До речі, зверніть увагу, що The Exit value of the program can be consulted with the DosExitCode function, але при цьому DosExitCode contains (in the low byte) the exit-code of a program executed with the Exec call.
https://www.freepascal.org/docs-html/rt … tcode.html

Це замітно ускладнить програму, і зробить її менш універсальною: наразі "логіку" запуску сторонніх програм (як і обирати самі програми) можна задавати в bash-скрипту і міняти в процесі експлуатації. Якщо все це перенести в тіло мого "CGI-процесора", то значно втратиться гнучкість його використання, або доведеться його сильно ускладнювати.
Ви мене мене переконали що використовувати код завершення для передачі результату роботи недоцільно (хоча б із-за обмеження по діапазону можливих значень), і я використав для цих цілей звичайний файл -- через нього можна передавати скільки завгодно і яких завгодно даних.
Просто я не люблю проводити подібні "буферні операції" через диск (і тим паче через flash). Звісно, можна створити віртуальний RAM-диск і писати/читати через нього. Ну Ви самі розумієте як такий спосіб можна назвати ...

Подякували: leofun011

30

Re: Процедура Halt в Free Pascal

Це замітно ускладнить програму, і зробить її менш універсальною: наразі "логіку" запуску сторонніх програм (як і обирати самі програми) можна задавати в bash-скрипту і міняти в процесі експлуатації. Якщо все це перенести в тіло мого "CGI-процесора", то значно втратиться гнучкість його використання, або доведеться його сильно ускладнювати.

Можна передавати в програму (через параметри командного рядка) ім'я підпорядкованого баш-скрипту, який запускатиметься з неї й виконуватиме всі потрібні дії та запуски програм. Інформацію з головної програми в підпорядкований баш-скрипт так само можна передавати через параметри командного рядка. Таких скриптів може бути декілька для різних ситуацій, що дозволить зробити роботу програми відносно гнучкою.

Подякували: leofun01, koala2

31

Re: Процедура Halt в Free Pascal

Вибачте, а в яких одиницях ви вимірюєте складність програми?

32

Re: Процедура Halt в Free Pascal

koala написав:

Вибачте, а в яких одиницях ви вимірюєте складність програми?

Часом, потраченим на її написання та відладку  :D

33

Re: Процедура Halt в Free Pascal

koala написав:

Вибачте, а в яких одиницях ви вимірюєте складність програми?

У даному випадку, небажання хардкодити всі підпорядковані виклики виглядає виправданим: відомо, що програма може мати декілька різних застосувань, що відрізняються обробкою результату роботи програми — якщо увесь баш-функціонал переписати на паскаль, це зробить код більш громіздким і вимагатиме робити універсальну програму, перенісши в неї функціонал усіх можливих баш-скриптів, у яких ця програма може використовуватись, яку, крім того, доведеться перекомпільовувати щоразу при внесенні змін у цей функціонал. Автор правильно мислить: логіку програми й логіку оболонки слід розділити.

Теоретично, якби існував простий спосіб передавати додаткові дані в середовище, з якого програму було викликано, то початково задуманий автором підхід був би оптимальним. Проте, це вже незовсім тривіальна задача, тому лишається варіант, описаний у моєму попередньому повідомленні.

Подякували: hadeix, Torbins, koala3

34

Re: Процедура Halt в Free Pascal

Погоджуся зі паном P.Y. - в такому разі, схоже, це найекономніше рішення.

35

Re: Процедура Halt в Free Pascal

hadeix написав:

Просто я не люблю проводити подібні "буферні операції" через диск (і тим паче через flash). Звісно, можна створити віртуальний RAM-диск і писати/читати через нього. Ну Ви самі розумієте як такий спосіб можна назвати ...

Навіщо такі складнощі, коли є пайпи:

program project1;

uses
  SysUtils;

procedure WritePipeLn(APipe: Longint; AStr: String);
begin
  AStr := AStr + LineEnding;
  FileWrite(APipe, AStr[1], Length(AStr));
end;

const
  PipeNumber = 3; // 2 and below are reserved by system
begin
  WriteLn('Test');
  WritePipeLn(PipeNumber, 'Hello World!');
end.

Запускати так:

./project1 3> >(cat)

Замість "cat" може бути будь-яка команда. Можна таким чином і декілька різних команд запустити, бо за замовчуванням у вас в запасі 1024 пайпа.

Подякували: ReAl, hadeix2

36

Re: Процедура Halt в Free Pascal

./project1 3> | cat

Не >, |.

37

Re: Процедура Halt в Free Pascal

koala
Та ні, там усе правильно, це Process Substition: https://www.redpill-linpro.com/sysadven … ution.html Сам тільки сьогодні про цю фічу дізнався :)

Подякували: koala, leofun012

38

Re: Процедура Halt в Free Pascal

Torbins написав:

koala
Та ні, там усе правильно, це Process Substition: https://www.redpill-linpro.com/sysadven … ution.html Сам тільки сьогодні про цю фічу дізнався :)

Та ж я десь на першій сторінці теми про це і писав. Тільки не знаю, як з цим у паскалі, то сішний приклад зробив з тривіальним fprintf на stderr (канал 2), щоб ще й dprintf-ом людей не лякати.

39

Re: Процедура Halt в Free Pascal

Torbins написав:

Навіщо такі складнощі, коли є пайпи:

.................
const
  PipeNumber = 3; // 2 and below are reserved by system
begin
  WriteLn('Test');
  WritePipeLn(PipeNumber, 'Hello World!');
end.

Запускати так:

./project1 3> >(cat)

Замість "cat" може бути будь-яка команда. Можна таким чином і декілька різних команд запустити, бо за замовчуванням у вас в запасі 1024 пайпа.

Дуже цікаво ! Чесно кажучи, навіть не знав про таке.

40

Re: Процедура Halt в Free Pascal

Torbins написав:

Навіщо такі складнощі, коли є пайпи:
.......
Запускати так:

./project1 3> >(cat)

Замість "cat" може бути будь-яка команда. Можна таким чином і декілька різних команд запустити, бо за замовчуванням у вас в запасі 1024 пайпа.

Вивести дані, згідно Вашого прикладу, звісно вдалося ..
Але підкажіть як виконати дві речі:
1. "піймати" цей вивід в зовнішньму bash-скрипту (замість cat);
2.перехопити результат виводу в пайп у якусь змінну всередині скрипта ?
Наприклад, перехопити вивід на stdoout в якусь змінну можна без проблем:

EXITCODE=$(./project1)
echo $EXITCODE

В результаті ми побачимо на екрані Test із Вашого прикладу. А потрібно Hello World! ...
Можна, звісно, для цього перенаправити вивід в пайп на stdout, а те що виводилося в stdout "погасити" :

EXITCODE=$(./project1 3>&1 1>/dev/null)
echo $EXITCODE

І ми побачимо саме лише Hello World!. Але ж обов'язкова умова була -- не чіпати stdout (оскільки туди виводиться інформація, яку не можна спотворювати і яку не можна "гасити").