Добрый день,4. В MS DOS, как известно, Control-Break распознается некоторыми функциями ввода. То есть мало того, что пользователь нажал CTRL-Break, при этом само по себе ничего не произойдет, программа еще не прервется и будет продолжать работу – надо, чтобы программа вызвала функцию чтения MS DOS с клавиатуры, поддерживающую обработку Ctr-Break (если был ctrl—break, из этой функции программа уже не вернется) :)
Во FreeBSD есть ^C и ^Z (suspend). Вопрос, они сразу действуют или как в MS DOS, т.е. надо, чтобы программа обратилась к терминалу? Какова внутренняя архитектура этих механизмов?Все вопросы - http://unixvop.narod.ru/
что-то мне подсказывает ,что Вы глупости пишете.
CTRL-Break генерирует прерывание и если в программе есть обработчик такового
и если этот тип прерываний не запрещен и/или если программа для MSDOS
периодически смотрит на буфер клавиатуры, тогда программа и
среагирует соответствующим образом. А то, что для _некоторых_
функций ввода это прерывание обрабатывается-это заслуга тех, кто разрабатывал
эти функции. А не Ваша или Вашей программы :-).
И кстати, ^C под MSDOS тоже работает. В "некоторых функциях чтения".Что касается *NIX и FreeBSD в частности...
У них тоже есть механизм прерываний, только называются они сигналами.
^C, ^Z и много-много разных... И послать их можно не только нажав на кнопки клавиатуры.
И эти прерывания программе посылает операционная система.
Посылает задаче сразу же. Без задержек, независимо от того, чем программа занята.
На то оно и прерывание ;-).
Как программа будет реагировать на эти сигналы - это как уж Вы напишите свою программу.
Может заблокировать их, может отложить реакцию...Вообще, лучше Вам почитать что-нибудь... Например, замечательную книгу
Рочкинда "Программирование для UNIX". После этого все должно стать понятнее.А про "сразу"... Это скорее философский вопрос ;-). О одновременности событий,
о параллельности в одноядерных CPU (например) и т.д.
Пару уточнений:
1. Прерывания и сигналы это очень разные механизмы.
2. SIGSTOP(это про ctrl+z), программа не может игнорировать/блокировать/отложить.
>Пару уточнений:
>2. SIGSTOP(это про ctrl+z), программа не может игнорировать/блокировать/отложить.А что значит не может отложить? Программа должна что-то сделать, обрабатывая этот сигнал, и только после этого уйдет в фон (jobs), или это уже от нее не зависит? Может этот сигнал программа не сама обрабатывает?
>>2. SIGSTOP(это про ctrl+z), программа не может игнорировать/блокировать/отложить.
>А что значит не может отложить?Она просто ничего не может сделать по этому поводу. Если STOP попал в процесс, то процесс останавливается сразу же без его ведома; не вызываются никакие обработчики. Аналогично с сигналом KILL, только его нельзя (или можно?) отправлять с терминала.
>что-то мне подсказывает ,что Вы глупости пишете.Ну, одна маленькая неточность. Я имел в виду, что прерывание будет сразу (если там нет прерываний более высокого приоритета), но программа снимется не сразу. Если не создавать процедуру обработки "Ctrl-Break...". Еще есть BREAK=ON (у Джордейна написано, что при этом вызов любой функции MS DOS будет проверять ctrl-break).
>А то, что для _некоторых_
>функций ввода это прерывание обрабатывается-это заслуга тех, кто разрабатывал
>эти функции. А не Ваша или Вашей программы :-)я такого не писал, моя заслуга в том, что я вызову эти функции, а не другие.
>Посылает задаче сразу же. Без задержек, независимо от того, чем программа занята.
Посылает-то сразу... а что дальше происходит внутри команды man например?
>Вообще, лучше Вам почитать что-нибудь... Например, замечательную книгу
>Рочкинда "Программирование для UNIX". После этого все должно стать понятнее.поищем. Но например в книге Теренса Чана "Системное программирование на C++ для Unix" нет даже определения демона.