Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Отследить CTRL-C и CTRL-D


Автор: d06osipov 2.9.2007, 21:30
Мне нужно Стандартным способом отследить нажатие CTRL-C, или ввод CTRL-D (конец файла). Я использую cin и cout, но подойдёт и другой, ещё раз подчёркиваю, Стандартный способ.

Автор: JackYF 2.9.2007, 22:11
feof(stdin)

Автор: Любитель 2.9.2007, 22:22
Конец файла, безусловно - cin.eof() (если юзать iostream).
ctrl + c - man sigaction.

Автор: JackYF 2.9.2007, 22:32
Цитата(Любитель @  2.9.2007,  22:22 Найти цитируемый пост)
ctrl + c - man sigaction. 

+1. по SIGTERM, если я не ошибаюсь.

Автор: archimed7592 3.9.2007, 03:58
Цитата(Любитель @  2.9.2007,  22:22 Найти цитируемый пост)
man sigaction

Цитата(d06osipov @  2.9.2007,  21:30 Найти цитируемый пост)
ещё раз подчёркиваю, Стандартный способ. 

Стандартного способа нет.

Автор: MAKCim 3.9.2007, 08:43
Цитата(JackYF @  2.9.2007,  22:32 Найти цитируемый пост)
SIGTERM, если я не ошибаюсь. 

SIGINT  smile 

Автор: JackYF 3.9.2007, 15:23
Цитата(MAKCim @  3.9.2007,  08:43 Найти цитируемый пост)
SIGINT  smile  

значит, таки ошибся smile. Спасибо за подсказку.

Автор: d06osipov 4.9.2007, 13:48
Когда у меня в программе cin>>str; и я компилирую  её на Visual Studio, то нажатие Ctrl-D влечёт набор "^D" в консоли (если компилировать g++, то работает как надо). Либо это идиотизм Microsoft (коих хватает), либо этот способ не оговаривается в Стандарте. Но должен же быть Стандартный способ?

Насчёт man sigaction, могу я по крайней мере ожидать, что это будет работать на всех известных компиляторах? Или у 99,9% программ, которые обрабатывают CTRL-C есть #ifdef конструкции для каждого компилятора?

Автор: archimed7592 4.9.2007, 15:51
Цитата(d06osipov @  4.9.2007,  13:48 Найти цитируемый пост)
Либо это идиотизм Microsoft (коих хватает), либо этот способ не оговаривается в Стандарте.

Этот способ оговаривается Стандартом POSIX, для которого тебе и привели вполне стандартное по posix'у решение.
Сам же стандарт оговаривает момент касающийся EOF, но не оговаривает какая комбинация клавиш в консоли приведёт к её закрытию.
В *nix - это ctrl+D... В dos/win9x/winNT это ctrl+C.

Автор: Любитель 8.9.2007, 16:25
Цитата(archimed7592 @  4.9.2007,  15:51 Найти цитируемый пост)
 ctrl+C

Везде означает прерывание текущей задачи.

В винде, насколько я помню, eof - ctrl+z.

Автор: archimed7592 8.9.2007, 16:58
Цитата(Любитель @  8.9.2007,  16:25 Найти цитируемый пост)
В винде, насколько я помню, eof - ctrl+z. 

Ааа, точно smile.

Автор: MAKCim 8.9.2007, 17:00
Цитата(archimed7592 @  4.9.2007,  15:51 Найти цитируемый пост)
В *nix - это ctrl+D...

это не зашито жестко
через настройки терминала все сочентания клавиш можно изменить
+ ctrl+D не закрывает программу в Linux, а по-умолчанию посылает ей на вход (если входом является терминал) EOF ('\0')

Автор: Mayk 8.9.2007, 18:33
Цитата(MAKCim @  8.9.2007,  21:00 Найти цитируемый пост)

+ ctrl+D не закрывает программу в Linux, а по-умолчанию посылает ей на вход (если входом является терминал) EOF ('\0') 

EOF это -1, а не 0. 


Автор: MAKCim 8.9.2007, 19:54
Mayk, 
это зависит от системы если уж быть точным

Автор: Любитель 8.9.2007, 20:12
Вообще интересно - как иногда активно обсуждаются достаточно тривиальные темы smile

Автор: Mayk 8.9.2007, 20:12
Цитата(MAKCim @  8.9.2007,  23:54 Найти цитируемый пост)

это зависит от системы если уж быть точным

Точно, соврал. EOF  < 0. Строго меньше 0.
Цитата(C99)

             EOF
    which expands to an integer constant expression, with type int and a negative value, that
    is returned by several functions to indicate end-of-file, that is, no more input from a
    stream;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)