Форум программистов, компьютерный форум CyberForum.ru

Выход по нажатию клавиши из терминала (Linux(UNIX) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Kidasov
76 / 76 / 12
Регистрация: 02.12.2011
Сообщений: 966
Записей в блоге: 3
26.07.2012, 16:58     Выход по нажатию клавиши из терминала (Linux(UNIX) #1
Уважаемые программисты, возникла проблема. Есть клиент, в нем 2 потока. Нужно организовать выход из программы по нажатию комбинации клавиш "Ctrl + D". Вот примерная схема.


C++
1
2
3
4
5
6
7
8
9
10
11
12
void *runStdIn() {
         char message[1024]
         listenSocket(sock, message);
         printf("%s", message);       
}
 
main() {
   pthread_create(&stdInThread, NULL, &runStdIn, NULL);
   while(1) {
        //if ((getche()) == 4) exit(1);
        sendMessage();
   }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2012, 16:58     Выход по нажатию клавиши из терминала (Linux(UNIX)
Посмотрите здесь:

Выход из консоли по нажатию клавиши C++
C++ Выход из бесконечного цикла по нажатию кнопки.
Выход по нажатию ESC C++
C++ Выход из выполнения по нажатию кнопки
C++ Выход из цикла по нажатию определенной клавиши
C++ выход по нажатию esc
C++ Действие по нажатию клавиши (не работает)
C++ Остановка потока по нажатию клавиши

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
26.07.2012, 18:03     Выход по нажатию клавиши из терминала (Linux(UNIX) #2
getche() и подобные функции здесь не будут работать. У меня первая мысль была сделать через сигналы, но Ctrl + D не посылает сигнала, это просто символ а-ля EOF.
Вот, что нагуглил:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <unistd.h> 
#include <stdio.h> 
#include <termios.h> 
#include <signal.h> 
 
void sig_hnd(int sig){ (void)sig; printf("(VINTR)"); }
 
int main(){
  setvbuf(stdout,NULL,_IONBF,0);
 
  struct termios old_termios, new_termios;
  tcgetattr(0,&old_termios);
 
  signal( SIGINT, sig_hnd );
 
  new_termios             = old_termios;
  new_termios.c_cc[VEOF]  = 3; // ^C
  new_termios.c_cc[VINTR] = 4; // ^D
  tcsetattr(0,TCSANOW,&new_termios);
 
  char line[256]; int len;
  do{
    len=read(0,line,256); line[len]='\0';
    if( len <0 ) printf("(len: %i)",len);
    if( len==0 ) printf("(VEOF)");
    if( len >0 ){
      if( line[len-1] == 10 ) printf("(line:'%.*s')\n",len-1,line);
      if( line[len-1] != 10 ) printf("(partial line:'%s')",line);
    }
  }while( line[0] != 'q' );
 
  tcsetattr(0,TCSANOW,&old_termios);
}
вот что говорит автор кода:
The program change the VEOF char (from Ctrl-D) to Ctrl-C and the VINTR char (from Ctrl-C) to Ctrl-D. If You press Ctrl-D then the terminal driver will send a SIGINT to the signal handler of the program.

Note: pressing VINTR will erase the terminal input buffer so You can not read the characters typed in the line before the VINTR key pressed.
конечно это кослыть, обмотаный изолентой и кровавыми бинтами, но если очень надо...
Yandex
Объявления
26.07.2012, 18:03     Выход по нажатию клавиши из терминала (Linux(UNIX)
Ответ Создать тему
Опции темы

Текущее время: 12:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru