Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/86: Рейтинг темы: голосов - 86, средняя оценка - 4.87
 Аватар для Daki
0 / 0 / 0
Регистрация: 24.10.2009
Сообщений: 16

Перехват Сигнала

28.05.2010, 11:03. Показов 19063. Ответов 58
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Тема работы "Сигналы". Мне дали доп задание: "Один источник посылает сигнал(любой, любым способом). Есть приёмник, который должен принимать эти сигналы. Нужно добавить перехватчик сигналов, и вывести количество перехваченных сигналов, если это получится". Кода нет вообще. Киньте хоть ссылки, где прочитать про эти перехватчики можно, ато я что-то совсем ничего не могу найти.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.05.2010, 11:03
Ответы с готовыми решениями:

Перехват сигнала с com/lpt/game порта
Можно ли средсвами .Net перехватить сигнал с com/lpt/game порта? Если да, то как? Заранее спасибо.

Перехват сигнала твоего телефона идущего через модем
В первую очередь, чисто теоретически возможно ли Перехватить сигнал твоего телефона идущего через модем... а в дополнение комп набирает...

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

58
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
25.02.2011, 12:09
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от niXman Посмотреть сообщение
имел ввиду саму обработку, а не доставку сигнала.
Поясни. Что значит асинхронная обработка

Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Обработчика сигнала вестимо
Обработчик сигнала должен быть минимальный. И не вызывать функций, которые имеют побочные эффекты в виде записи в глобальную память, когда имеется шанс, что сигнал появится в процессе работы именно такой функции. Мне кажется, что об этом в любом учебнике написано
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
25.02.2011, 12:16
Цитата Сообщение от niXman Посмотреть сообщение
имел ввиду саму обработку, а не доставку сигнала.
Посмотрел. Если не брать во внимание вариант с kqueue() (у которого есть свои минусы) это тонкая обертка над уже упомянутыми в этом топике примитивами.
Т.е. если у вас cpp проект уже использующий Boost:asio это будет очень удобный вариант, но тащить asio только ради сигналов - уж увольте...

Добавлено через 6 минут
Обработчик сигнала должен быть минимальный. И не вызывать функций, которые имеют побочные эффекты в виде записи в глобальную память, когда имеется шанс, что сигнал появится в процессе работы именно такой функции. Мне кажется, что об этом в любом учебнике написано
Я вам уже показывал, что в классике жанра, у Стивенса показан код c longjmp() - если вы думаете, что в других учебниках лучше, то это к сожалению не так.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.02.2011, 12:24
Цитата Сообщение от Evg Посмотреть сообщение
Поясни
ну вот поймали мы сигнал. в теле handler() мы можем сначала обработать сигнал а потом запустить снова ожидание. или, сначала запустить ожидание нового сигнала, а потом обработать текущий.

Добавлено через 1 минуту
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Если не брать во внимание вариант с kqueue()
это который?

Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
сли у вас cpp проект уже использующий Boost:asio это будет очень удобный вариант, но тащить asio только ради сигналов - уж увольте...
кому как...
у меня boost устанавливается первым после компилятора.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
25.02.2011, 12:29
Цитата Сообщение от niXman Посмотреть сообщение
Добавлено через 1 минуту
это который?
На *BSD то о чем вы говорите сделано через kqueue(), соответственно man kqueue/kevent про EVFILT_SIGNAL
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.02.2011, 12:34
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
то о чем вы говорите сделано через kqueue()
понял.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
25.02.2011, 12:37
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Я вам уже показывал, что в классике жанра, у Стивенса показан код c longjmp()
А книга какого года? Потому что setjmp-longjmp "сейчас" и "раньше" работают (или могут работать) немного по разному. Сейчас, например, на linux'е есть два раздельных вызова: setjmp и sigsetjmp (с сохранением сигнальной маски и без неё). Т.е. код, нормально работающий на одной системе, может оказаться нерабочим на другой.

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

Добавлено через 34 секунды
Цитата Сообщение от niXman Посмотреть сообщение
ну вот поймали мы сигнал. в теле handler() мы можем сначала обработать сигнал а потом запустить снова ожидание. или, сначала запустить ожидание нового сигнала, а потом обработать текущий
А что значит "запустить ожидание"?
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.02.2011, 12:38
Цитата Сообщение от Evg Посмотреть сообщение
А что значит "запустить ожидание"?
запустить ожидание следующего сигнала. оно ведь у нас асинхронное.
т.е. на один вызов async_wait() мы получим один сигнал. чтоб получить следующий, нужно снова вызвать async_wait()
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
25.02.2011, 12:41
Цитата Сообщение от niXman Посмотреть сообщение
т.е. на один вызов async_wait() мы получим один сигнал. чтоб получить следующий, нужно снова вызвать async_wait()
Всё, понял, что подразумевалось под "асинхронной обработкой сигналов". Не знаю, насколько это хороший способ работы с сигналами в принципе. Т.е. у тебя программа начала что-то в цикле считать, но из-за косякой ушла в бесконечный цикл, после чего уже никакой сигнал обработан не будет
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.02.2011, 12:45
Цитата Сообщение от Evg Посмотреть сообщение
программа начала что-то в цикле считать, но из-за косякой ушла в бесконечный цикл
о каком цикле речь?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
25.02.2011, 13:16
Цитата Сообщение от Evg Посмотреть сообщение
А книга какого года? Потому что setjmp-longjmp "сейчас" и "раньше" работают (или могут работать) немного по разному. Сейчас, например, на linux'е есть два раздельных вызова: setjmp и sigsetjmp (с сохранением сигнальной маски и без неё). Т.е. код, нормально работающий на одной системе, может оказаться нерабочим на другой.
У меня переиздание 2002г.
Это не linux это вполне себе честный POSIX.
Засада в том, что после longjmp() не будут восстановлены как минимум статические переменные в [g] libc и malloc-структуры, в не зависимости от того делали ли мы setjmp() или sigsetjmp()

Я не считаю себя специалистом в данной области, а потому писать статью про тонкие моменты этого дела не буду.
То же самое могу сказать и про себя, по этому и предложил чужой текст в качестве основы.
PS: вот тока сам текст вставить забыл)))
не лезет( форум говорит многа букф(((

Добавлено через 31 минуту
Цитата Сообщение от Evg Посмотреть сообщение
Всё, понял, что подразумевалось под "асинхронной обработкой сигналов". Не знаю, насколько это хороший способ работы с сигналами в принципе. Т.е. у тебя программа начала что-то в цикле считать, но из-за косякой ушла в бесконечный цикл, после чего уже никакой сигнал обработан не будет
Похоже таки не поняли)
Плюс и он же минус обертки в boost в том, что собственно к обработке сигнала пользовательский код _не_ пускают. Работает оно так: в реальном обработчике сигнал ставиться в очередь (почти как в ОС, но с гарантией, что сигнал не будет потерян), а собственно обработка уже происходит по вызову async_wait().
Т.е. правильнее говорить, не об "ассинхронной", а об "отложенной" схеме обработки сигнала.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
25.02.2011, 13:54
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Работает оно так: в реальном обработчике сигнал ставиться в очередь (почти как в ОС, но с гарантией, что сигнал не будет потерян), а собственно обработка уже происходит по вызову async_wait().
Т.е. правильнее говорить, не об "ассинхронной", а об "отложенной" схеме обработки сигнала.
Вот я и говорю, что такой вариант ненадёжен.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* код, который типа якобы должен исполнить 100 итераций */
for (i = 0; i < 100; i++)
{
  ...
  /* в результате какого-то косяка срабатывает присваивание,
   * из-за чего цикл стал бесконечным */
  i = 10;
  ...
}
 
/* Здесь типа мы должны были поймать сигнал (например, требование
 * сохранить конфиги и завершить программу), но при такой схеме сигнал
 * мы уже никогда не поймаем и теперь программу можно только прибить
 * намертво и, возможно, потерять важные данные */
async_wait();
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
25.02.2011, 13:59
Ну это вы за уши притянули)
С таким же успехом можно впасть в вечный цикл до sigaction() и вместо чтения конфига или чего-то еще тихо помереть)))
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
25.02.2011, 14:07
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Ну это вы за уши притянули)
Вовсе не за уши. Вполне себе рабочая ситуация для софтины, которая многими сутками работает без остановок

Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
С таким же успехом можно впасть в вечный цикл до sigaction() и вместо чтения конфига или чего-то еще тихо помереть)))
Есть две разные вещи. Ошибка в процессе обработки сигнала и ошибка где-то в другом месте. Первое у тебя локализовано, второе - размазано по всей программе. Ты один раз обрабатываешь механизм отлова сигнала, сохранение данных и выход из программы и всё. После чего тебе не страшны косяки, которые время от времени появляются в процессе разработки прочих узлов программы. А модуль с обработкой сигнала ты больше не трогаешь
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
25.02.2011, 14:21
Цитата Сообщение от Evg Посмотреть сообщение
Вовсе не за уши. Вполне себе рабочая ситуация для софтины, которая многими сутками работает без остановок
Есть две разные вещи. Ошибка в процессе обработки сигнала и ошибка где-то в другом месте. Первое у тебя локализовано, второе - размазано по всей программе. Ты один раз обрабатываешь механизм отлова сигнала, сохранение данных и выход из программы и всё. После чего тебе не страшны косяки, которые время от времени появляются в процессе разработки прочих узлов программы. А модуль с обработкой сигнала ты больше не трогаешь
Простите, но это разговор не о чем.
На мой взгляд ошибка приводящее к не возможности позвать async_wait() или sigaction() для сигнала скажем с SA_RESETHAND вещи одного порядка... и вряд ли вы меня переубедите.

На мой взгляд, все что должен сделать обработчик сигнала, это
Code
1
sig_atomic_t flag = 1;
, а вся реальная работата по обработке должна выполняться в момент когда приложение хочет этого.
Т.е. фактически то же, что реализовано в Boost:asio, но без плясок с очередями (мне они просто не нужны).
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
25.02.2011, 14:35
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
На мой взгляд ошибка приводящее к не возможности позвать async_wait() или sigaction() для сигнала скажем с SA_RESETHAND вещи одного порядка...
Не одного. Если ты зарегистрировал сигнал через свой механизм отложенной обработки, то обработка запустится только по достижении async_wait. Если ты зарегистрировал сигнал через sigaction, то обработка сигнала запустится независимо от того, в какой позе стоИт твоя программа. sigaction зовётся как правило вначале программы - там же, где в вашем способе зовётся asio::signal_set (насколько я понимаю, это регистрация сигнала). Т.е. "мой способ":

C
1
2
3
sigaction
...
бесконечный цикл
а "ваш" способ:

C
1
2
3
4
5
asio::signal_set signals
...
бесконечный цикл
...
signals.async_wait
и слабое место в этой цепочке - это требование "ручками" запустить обработчик сигналов. В "моём" способе обработчик сигналов запустится независимо от моего желания

Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
а вся реальная работата по обработке должна выполняться в момент когда приложение хочет этого
Я и привожу пример, когда такое желание чревато плохими последствиями. Т.е. это не панацея, а выход из ситуации в простых случаях. Изначально речь шла об использовании printf'а внутри обработчика сигнала. Далее был приведён пример с asio, как способ обойти данную проблему. Я в свою очередь привёл пример, когда такой способ оказывается ненадёжным. Я не пытаюсь утверждать, что asio нельзя использовать в принципе, я пытаюсь показать пример, где есть крайняя необходимость обойтись без этого. Желание упростить код похвально, но до тех пор, пока оно не превращается в то, что программист свои заботы перекладывает на пользователя
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.02.2011, 14:40
все же так:
C++
1
2
3
4
5
asio::signal_set signals
signals.async_wait()
...
бесконечный цикл
...
Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
требование "ручками" запустить обработчик сигналов
я же показал, как:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void handler(
    const asio::error_code& error,
    int signal_number,
    asio::signal_set* signal_set)
{
  if (!error)
  {
    // A signal occurred.
    ...
    signal_set->async_wait(boost::bind(&handler, _1, _2, signal_set));
  }
}
тут еще один плюс в том, что ты можешь по какому-то условию решить, запускать или не запускать ожидание следующего сигнала.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
25.02.2011, 14:45
Цитата Сообщение от niXman Посмотреть сообщение
все же так
В коротком примере - да, так. Но если у тебя этих циклов миллион, то каждый раз около каждого цикла что ли будешь двигать код? Ты просто смотришь на пример со своей позиции (упростить код). Мне это упрощение понятно, но неинтересно, потому что я рассматриваю совершенно другое применение сигнала (сохранение текущих данных и завершение по сигналу в случае зацикливания программы)

Цитата Сообщение от niXman Посмотреть сообщение
тут еще один плюс в том, что ты можешь по какому-то условию решить, запускать или не запускать ожидание следующего сигнала
Если исполнение дойдёт до handler'а.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
25.02.2011, 14:49
Цитата Сообщение от Evg Посмотреть сообщение
Не одного. Если ты зарегистрировал сигнал через свой механизм отложенной обработки, то обработка запустится только по достижении async_wait. Если ты зарегистрировал сигнал через sigaction, то обработка сигнала запустится независимо от того, в какой позе стоИт твоя программа. sigaction зовётся как правило вначале программы - там же, где в вашем способе зовётся asio::signal_set (насколько я понимаю, это регистрация сигнала). Т.е. "мой способ":

C
1
2
3
sigaction
...
бесконечный цикл
а "ваш" способ:

C
1
2
3
4
5
asio::signal_set signals
...
бесконечный цикл
...
signals.async_wait
и слабое место в этой цепочке - это требование "ручками" запустить обработчик сигналов. В "моём" способе обработчик сигналов запустится независимо от моего желания
Я еще раз могу повторить, ваш пример не корректен. Вы совершенно, правильно и верно показываете как делать не надо (boost:asio), но почему-то напрочь отрицаете возможность сделать точно такую же глупость на signal()/sigaction() или ошибиться с sigmask().

Я и привожу пример, когда такое желание чревато плохими последствиями. Т.е. это не панацея, а выход из ситуации в простых случаях. Изначально речь шла об использовании printf'а внутри обработчика сигнала. Далее был приведён пример с asio, как способ обойти данную проблему. Я в свою очередь привёл пример, когда такой способ оказывается ненадёжным. Я не пытаюсь утверждать, что asio нельзя использовать в принципе, я пытаюсь показать пример, где есть крайняя необходимость обойтись без этого. Желание упростить код похвально, но до тех пор, пока оно не превращается в то, что программист свои заботы перекладывает на пользователя
Ну asio тут наверное вообще просто так опоминули в качестве офтопика)
Я согласен с вами, беда asio и других подобных фреймворках напрочь убивают у большинства программистов представление о том "а как же оно на самом деле работает". Но это совсем уже офтопик)))
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.02.2011, 14:53
Цитата Сообщение от Evg Посмотреть сообщение
если у тебя этих циклов миллион, то каждый раз около каждого цикла что ли будешь двигать код?
нет.
так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void handler(
    const asio::error_code& error,
    int signal_number,
    asio::signal_set* signal_set)
{
  if (!error)
  {
    // A signal occurred.
    ...
    signal_set->async_wait(boost::bind(&handler, _1, _2, signal_set));
  }
}
 
int main() {
   asio::signal_set signals;
   signals.async_wait(boost::bind(&handler, _1, _2, &signals));
   ...
}
Добавлено через 2 минуты
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
беда asio и других подобных фреймворках напрочь убивают у большинства программистов представление о том "а как же оно на самом деле работает".
с этим согласен.
но несколько раз, в разных проектах, писать один и тот же код - нет смысла.
ну понял я как это работает. и хватит. юзаю asio.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
25.02.2011, 14:58
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
но почему-то напрочь отрицаете возможность сделать точно такую же глупость на signal()/sigaction() или ошибиться с sigmask()
Я не отрицаю. Я отдельно писал, что эту вещь ты отлаживаешь только один раз. Один раз воткнул в начало main'а инциализацию модуля обработки сигналов, один раз отладил модуль и забыл про это. При дальнейшем внесении ошибки в прочие фрагменты программы (а работать ты будешь только с ними, не трогая обработку сигналов), ты застрахова тем, что обработка сигналов у тебя надёжно работает и в случае зацикливания программы ты данные условно не потеряешь. В варианте с asio надо постоянно заниматься расстановкой точек отложенной обработки, при этом нет никакой гарантии того, что в каком-то цикле ты не застрянешь. А точнее, гарантия есть - если внимательно глазами отслеживать каждый цикл.

Я просто к чему завёл весь этот спор. Мы тут все трое понимаем, о чём идёт речь и понимаем, что надо было бы делать в то или иной ситуации. Но кто-то непонимающий прочтёт про то, что есть такая ацки удобная штука как asio и будет считать, что так оно и надо делать всегда. По типу того, что какой-нибудь автор напишет безапеляционным тоном, что в Си++ надо использовать переменные const вместо макросов, так 9 из 10 человек, прочитавших книгу, начинают орать на каждом повороте, что макросы это для лохов, а тру-программеры пользуются модификаторами const
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.02.2011, 14:58

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

Моделирование сигнала, шумового процесса, смеси сигнала с шумом
Доброе время суток. Помогите пожалуйста решить данное задание в MatLab. На двух вложениях одно задание.

Задан вид периодического сигнала и его числовые характеристики. Для данного сигнала необходимо сделать
Задан вид периодического сигнала и его числовые характеристики. Для данного сигнала необходимо: 1) начертить осциллограмму; 2)...

Открыть файл формата WAV, воспроизвести его и отобразить график амплитуды и времени этого сигнала (файла), а также спектр сигнала
Здравствуйте ! Помогите пожалуйста с программой на Delphi 7. Не могу написать программу которая по нажатию вкладки ОТКРЫТЬ в меню...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru