Re: Процедура Halt в Free Pascal
Ви так і не відповіли на питання, яку саме інформацію ви хочете видавати з неї ОДНОЧАСНО з виведенням веб-сторінки.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Pascal/Delphi → Процедура Halt в Free Pascal
Ви так і не відповіли на питання, яку саме інформацію ви хочете видавати з неї ОДНОЧАСНО з виведенням веб-сторінки.
Ви так і не відповіли на питання, яку саме інформацію ви хочете видавати з неї ОДНОЧАСНО з виведенням веб-сторінки.
Якщо перечитати все з самого початку, то мабуть було б зрозуміло. Гаразд, спробую коротко:
при певних умовах програма виводить веб-сторінку в stdout і після цього повинна передати код свого завершення іншому процесові. Зрозуміло, що через stdout це робити не можна, бо зіпсується вигляд сторінки.
koala написав:Ви так і не відповіли на питання, яку саме інформацію ви хочете видавати з неї ОДНОЧАСНО з виведенням веб-сторінки.
Якщо перечитати все з самого початку, то мабуть було б зрозуміло. Гаразд, спробую коротко:
при певних умовах програма виводить веб-сторінку в stdout і після цього повинна передати код свого завершення іншому процесові. Зрозуміло, що через stdout це робити не можна, бо зіпсується вигляд сторінки.
Ні, не зрозуміло. Вона не повинна передавати код помилки, якщо помилки не сталося, а код завершення призначається саме для зберігання коду помилки. Ви хочете передати якусь іншу інформацію. Яку саме? Можете не коротко, якби мені було шкода часу, я б взагалі вам не відповідав.
Ні, не зрозуміло. Вона не повинна передавати код помилки, якщо помилки не сталося, а код завершення призначається саме для зберігання коду помилки. Ви хочете передати якусь іншу інформацію. Яку саме? Можете не коротко, якби мені було шкода часу, я б взагалі вам не відповідав.
Програма відпрацьовує певні задачі, в залежності від результатів формує із шаблонів та виводить якусь із веб-сторінок в stdout, плюс виставляються відповідні біти "вихідного регістра" (назвемо його так, раз Вам не подобається "код завершення"), і число яке ми отримали в "вихідному регістрі" потрібно передати іншому процесові (bash-скрипту, наприклад. Причому програма може запускатися на початку цього скрипта і результат оброблятися ним нижче), де біти перевіряються по масці за допомогою логічної функції AND, і, відповідно, виконуються потрібні дії шляхом запуску сторонніх програм.
Поки що проблему передачі вмісту "вихідного регістра" вирішив шляхом запису його значення в файл. Але цей спосіб мені не подобається.
Ви весь час намагаєтеся описати СПОСІБ, а не МЕТУ. Регістр, код, біти маски - це СПОСІБ, розумієте? Вам треба передати інформацію з програми в скрипт. Нащо? Чому програма не може виконати ці ж дії? Чому їх не може виконати веб-сервер - який, до речі, такою дурнею, як обробка побітова кодів помилки, не страждає.
Розумієте, у вас є командна оболонка. Це - велика складна програма; припущу навіть, що складніша за вашу. Але вам чомусь обов'язково її треба використати, і передати дані саме в неї. Чому? CGI не передбачає її використання; та й ви, хоче пишете на початку про CGI, далі про нього не згадуєте. В усіх цих кодах, регістрах, бітах, масках немає CGI.
хочете передати якусь іншу інформацію. Яку саме?
Ну не хоче він відповідати на це питання. Може в нього там секретні матеріали.
виставляються відповідні біти "вихідного регістра" (назвемо його так, раз Вам не подобається "код завершення"), і число яке ми отримали в "вихідному регістрі" потрібно передати іншому процесові ...
біти ...
А що означають ці біти ?
koala написав:хочете передати якусь іншу інформацію. Яку саме?
Ну не хоче він відповідати на це питання. Може в нього там секретні матеріали.
Ну хоч хтось мене розуміє Дійсно, яка різниця що там за інформація передається ?
hadeix написав:виставляються відповідні біти "вихідного регістра" (назвемо його так, раз Вам не подобається "код завершення"), і число яке ми отримали в "вихідному регістрі" потрібно передати іншому процесові ...
біти ...А що означають ці біти ?
Що завгодно, в залежності від налаштувань програми в конфігураційному файлі.
Наприклад, один із варіантів: в залежності від попередніх результатів та умов, користувачу відвантажується відповідна веб-сторінка, де він повинен проставити потрібні "галочки". Далі через CGI цей результат віддається моїй програмі (я вже називав її раніше умовно "CGI-процесором"), вона виводить, використовуючи відповідний шаблон, чергову веб-сторінку в stdout і, в залежності від проставлених "галочок" на попередній сторінці, встановлюються відповідні біти "вихідного регістру". Все, програма завершилася. Але дані цього "регістру" обробляються далі в bash-скрипту і по результатам запускаються зовсім сторонні програми.
Моя програма -- всього лише допоміжний інструмент, щоб значно полегшити написання CGI-скриптів у вигляді bash. Вона уміє авторизувати користувача, просто тупо сформувати по шаблону (замінює в ньому аліаси на реальні значення) веб-сторінку, відправити її в stdout та заповнити "вихідний регістр", або в залежності від вхідних по CGI даних зробити аналогічні дії використовуючи для кожного випадку свої web-шаблони та формуючи дані в "вихідному регістрі".
Всі налаштування задаються в текстовому конфігураційному файлі.
Її можна запускати як самостійний CGI-скрипт, або у складі CGI-скрипта у вигляді bash.
Та задача що стояла у мене з самого початку вирішена, все чудово працює, результат цілком усіх задовольняє. Лише мені особисто не подобається передавати результати виконання програми в інші процеси через файл. От і все.
Ну якщо вже кому так приспічило взнати що за початкова задача -- то це віддалене керування апаратурою. Поки що через звичайний комп. Далі планується застосувати замість нього дешевий і набагато менш ненажерливий Raspberry Pi.
А чому не можна викликати інші програми одразу з Паскаля? Уникнете кількох зайвих операцій.
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
А чому не можна викликати інші програми одразу з Паскаля? Уникнете кількох зайвих операцій.
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-диск і писати/читати через нього. Ну Ви самі розумієте як такий спосіб можна назвати ...
Це замітно ускладнить програму, і зробить її менш універсальною: наразі "логіку" запуску сторонніх програм (як і обирати самі програми) можна задавати в bash-скрипту і міняти в процесі експлуатації. Якщо все це перенести в тіло мого "CGI-процесора", то значно втратиться гнучкість його використання, або доведеться його сильно ускладнювати.
Можна передавати в програму (через параметри командного рядка) ім'я підпорядкованого баш-скрипту, який запускатиметься з неї й виконуватиме всі потрібні дії та запуски програм. Інформацію з головної програми в підпорядкований баш-скрипт так само можна передавати через параметри командного рядка. Таких скриптів може бути декілька для різних ситуацій, що дозволить зробити роботу програми відносно гнучкою.
Вибачте, а в яких одиницях ви вимірюєте складність програми?
Вибачте, а в яких одиницях ви вимірюєте складність програми?
Часом, потраченим на її написання та відладку
Вибачте, а в яких одиницях ви вимірюєте складність програми?
У даному випадку, небажання хардкодити всі підпорядковані виклики виглядає виправданим: відомо, що програма може мати декілька різних застосувань, що відрізняються обробкою результату роботи програми — якщо увесь баш-функціонал переписати на паскаль, це зробить код більш громіздким і вимагатиме робити універсальну програму, перенісши в неї функціонал усіх можливих баш-скриптів, у яких ця програма може використовуватись, яку, крім того, доведеться перекомпільовувати щоразу при внесенні змін у цей функціонал. Автор правильно мислить: логіку програми й логіку оболонки слід розділити.
Теоретично, якби існував простий спосіб передавати додаткові дані в середовище, з якого програму було викликано, то початково задуманий автором підхід був би оптимальним. Проте, це вже незовсім тривіальна задача, тому лишається варіант, описаний у моєму попередньому повідомленні.
Погоджуся зі паном P.Y. - в такому разі, схоже, це найекономніше рішення.
Просто я не люблю проводити подібні "буферні операції" через диск (і тим паче через 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 пайпа.
koala
Та ні, там усе правильно, це Process Substition: https://www.redpill-linpro.com/sysadven … ution.html Сам тільки сьогодні про цю фічу дізнався
koala
Та ні, там усе правильно, це Process Substition: https://www.redpill-linpro.com/sysadven … ution.html Сам тільки сьогодні про цю фічу дізнався
Та ж я десь на першій сторінці теми про це і писав. Тільки не знаю, як з цим у паскалі, то сішний приклад зробив з тривіальним fprintf на stderr (канал 2), щоб ще й dprintf-ом людей не лякати.
Навіщо такі складнощі, коли є пайпи:
................. const PipeNumber = 3; // 2 and below are reserved by system begin WriteLn('Test'); WritePipeLn(PipeNumber, 'Hello World!'); end.
Запускати так:
./project1 3> >(cat)
Замість "cat" може бути будь-яка команда. Можна таким чином і декілька різних команд запустити, бо за замовчуванням у вас в запасі 1024 пайпа.
Дуже цікаво ! Чесно кажучи, навіть не знав про таке.
Навіщо такі складнощі, коли є пайпи:
.......
Запускати так:./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 (оскільки туди виводиться інформація, яку не можна спотворювати і яку не можна "гасити").